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>
Related
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>
I am trying to load my resources which I have bundled in a jar file.
Originally they where placed under src/main/resources/*.wav.
To generate my jar file I have used the maven-jar-plugin.
If I unpack the jar file I can see the resource files.
In my source code I am loading the files with
AudioSystem.getAudioInputStream(MyClass.class.getResourceAsStream("/my-file.wav"));
When I run the application via IntelliJ this seems to work.
However when I try to execute the generated jar file the resources cannot be loaded.
Did I miss something? Maybe the classpath?
EDIT
My pom.xml has the following build property:
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>MyMain</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<configuration>
<mainClass>MyMain</mainClass>
</configuration>
</plugin>
</plugins>
</build>
I figured out what the problem was.
The problem has not been with maven.
It was the source code, which should be changed to:
URL url = this.getClass().getClassLoader().getResource("my-resource.wav");
AudioSystem.getAudioInputStream(url)
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>
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>
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.