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.
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)
I want to run my main class which is present in the src/comm instead of src/java/main.
I tried using:
mvn exec:java -Dexec.mainClass=src.communication.Launcher.Launcher
This statement gives me the "class not found exception".
The hierarchy is like src/communication is the source folder, then Launcher is package and the Launcher.java is the class file.
How can I execute this file from the command line as my main function is inside this class?
Use maven-jar-plugin and put in the manifest in your main class,
but it is better to use src/java/main than the other folder.
<build>
<plugins>
<plugin>
<!-- Build an executable JAR -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<mainClass>pacakgeAndClasseName</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
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
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>