Executable Jar with external jar and dependency using maven - java

There are two Java applications: application 1 and application 2.
I want to use jar file of application 1 in application 2. I want to create executable jar of application 2 so that I can execute application 2 as jar by command line.
Application one: There are classes in application 1 as ClassA.java, ClassB.java
pom.xml:
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
I created jar file of application 1 using mvn clean compile assembly:single
Now I have added jar file of application 1 created before as an external jar in application 2.
In application 2 There is a main class : migration.DataMigration.java
There are dependencies also in pom.xml of application 2.
DataMigration class is using ClassA.java and ClassB.java.
Now I want to create a executable jar of application.
I tried to create this using maven-assembly-plugin but I got error : ClassA.class not not found, ClassB.class not found : it means jar of application 1 is not being available during executable jar creation.
but when I run application 2 in eclipse it executes correctly without error.
Can any one suggest how to create executable jar of application 2

In application2.jar you can specify to add application1.jar to its classpath.
In the META-INF/manifest.mf file of application2.jar add:
Class-Path:application1.jar
if the application1.jar is stored aside (in the same directory) of application2.jar it will be added to the classpath by the runtime.
To realize this in your maven-build:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
...
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
...
</plugin>
Source: http://maven.apache.org/shared/maven-archiver/examples/classpath.html

Related

No main manifest attribute, but I have it in my jar

I am trying to run my java web app on AWS EC2 instance. The error I am getting is
no main manifest attribute, in app.jar
Going through other questions, I found that the problem can be with MANIFEST.mf file. I have that file under META-INF folder, however its missing Main Class tag.
I developed Java web app using servlets and stuff, but I didn't use SpringBoot, and I am unsure what the starting point of my program is.
Here is a part of my pom.xml:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
</plugin>
I thought that maven-jar-plugin would solve this by itself, but unfortunately that is not the case.
As a side note, I tried both war and jar packaging.
Any ideas how to make this work? Should I hardcode something in MANIFEST.mf by myself?
My goal is to start my webapp on EC2 using this command:
java -jar app.jar
for the maven-jar-plugin there is a place to configure the manifest. I have it like this in my project
my project is years old so please have a look at the documentation for the plugin: https://maven.apache.org/plugins/maven-jar-plugin/examples/manifest-customization.html
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>webServer.main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>

maven is not creating META-INF for spring boot project

When I build my Spring boot project, it creates an target folder and
target/classes also, but it doesn't create any META-INF. I have also included dependency -
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<archive>
<index>true</index>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
<manifestEntries>
<mode>development</mode>
<url>${project.url}</url>
<key>value</key>
</manifestEntries>
</archive>
</configuration>
Two ways to do it.
Form the maven-jar-plugin documentation :
Please note that the following parameter has been completely removed
from the plugin configuration:
useDefaultManifestFile
If you need to define your own MANIFEST.MF file you can simply achieve
that via Maven Archiver configuration like in the following example:
<configuration>
<archive>
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
</archive>
</configuration>
where in you can place your MANIFEST.MF under src/main/resources/META-INF folder of your project. The command
mvn clean package
would build the project jar with the src/main/resources by default.
The notes at usage of the plugin states that
Starting with version 2.1, the maven-jar-plugin uses Maven Archiver
3.1.1. This means that it no longer creates the Specification and Implementation details in the manifest by default. If you want them
you have to say so explicitly in your plugin configuration.
Which can be done using:
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>

How to refer maven dependency jars from an executable jar?

I have an executable jar which needs to be placed in an Eclipse Maven project (Lets assume in the first folder of the project). In the manifest file of this jar, I need to refer to the maven dependency jars. How can I specify that in MANIFEST.MF file using pom.xml? Is it possible?
Yes, you can specify jars using maven-jar-plugin.
you can specify dependent jars in manifest tag
E.g.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>dependency-jars/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>

Could not load main class in jar created by Netbeans using Maven

I created a Maven Java Application project. I have defined following tags in the pom file,
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.it.rng.dataservice.DataService</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
When I build the project in NetBeans, The jar is created in the target folder as expected. But when I try to run that jar using,
java -jar application.jar
i get the following error,
Error: Could not find or load main class com.it.rng.dataservice.DataService
I have checked the jar's contents and the class files are inside the directory as follows,
application.jar->com->it->rng->dataservice->DataService.class
I am not sure what is wrong here. Please let me know if I am missing anything.
Edit:
Also the application runs fine if I use the 'Run' command in the IDE.

Missing Main-Class attibute in MANIFEST.MF in Maven generated jar file

I am currently experimenting with Maven in Eclipse (m2e-Plugin) and tried to build and run the Hello World example project. However, when launching the generated jar, nothing happens. I checked the MANIFEST.MF and noticed that the Main-Class attribute was missing. After adding the attribute, the jar could be launched.
Why does Maven not add this attribute?
Have a look at this link:
https://maven.apache.org/shared/maven-archiver/examples/classpath.html#aAdd
You can find there how to configure your maven project to run specific class. You have to add maven-jar-plugin configuration with mainClass defined.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
...
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
</configuration>
...
</plugin>
</plugins>

Categories