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

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>

Related

Add Property File from Another Jar (Maven)

I am trying to do a maven build (lets say A.jar), where the property file resides in one of the dependencies (lets say, B.jar) that I am adding. Is there any way to add the properties from B.jar to A.jar or to read them in some way from B.jar? I looked at some questions, but none of them were helpful. I need to run an exec-maven-plugin, the class needs to read two property files from B.jar to run. At this point, I am moving around in circles. Is there something like an overlay (maven-war-plugin) in maven-jar-plugin or something that is similar?
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<inherited>true</inherited>
<configuration>
<archive>
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
</archive>
<classifier>classes</classifier>
<forceCreation>true</forceCreation>
</configuration>
</plugin>
This is my plugin configuration at the moment. But the plugin is very short of options! Thanks in advance!

How to load resources which are bundled in an executable jar file which was generated by maven?

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)

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.

Executable Jar with external jar and dependency using maven

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

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