I am trying to run TestNG tests. My Project organization is - src->test->java->com->shn->library The below command works well in Windows but fails in Linux.
mvn -X clean exec:java -Dexec.mainClass="com.shn.library.RunSuitesInParallel" -Dexec.classpathScope=test -e
Error Seen in Linux on running the same command -
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2.1:java (default-cli) on project UAF: An exception occured while executing the Java class. com.shn.library.RunSuitesInParallel -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2.1:java (default-cli) on project UAF: An exception occured while executing the Java class. com.shn.library.RunSuitesInParallel
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:217)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
Caused by: org.apache.maven.plugin.MojoExecutionException: An exception occured while executing the Java class. com.shn.library.RunSuitesInParallel
at org.codehaus.mojo.exec.ExecJavaMojo.execute(ExecJavaMojo.java:352)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
... 19 more
Caused by: java.lang.ClassNotFoundException: com.shn.library.RunSuitesInParallel
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:285)
at java.lang.Thread.run(Thread.java:722)
[ERROR]
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
I ran -
mvn clean install.
Post which when I run -
mvn -X clean exec:java -Dexec.mainClass="com.shn.library.RunSuitesInParallel" -Dexec.classpathScope=test -e
The compiled classes get deleted & the error is apparent.
So the solution is -
mvn -X clean install exec:java -Dexec.mainClass="com.shn.library.RunSuitesInParallel" -Dexec.classpathScope=test -e
Though the accepted answer is fine, this might also help somebody.
It seems you need to make sure you're building the Maven Project before running any plugin goals that rely on the compiled classes.
In case when you create a new java class, By the time you going to use the plugin goal, ClassNotFoundException
is thrown because there is no compiled version of that class (plugin rely on the compiled version of the class).
Just assume you have a plugin configuration like below in your pom.xml (NOTE : original SO question it mentions about running the main class directly without specifying it in a pom.xml, and how to do it is explained in the accepted answer by praneel),
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>com.myproj.java.Main</mainClass>
</configuration>
</plugin>
So before you run any plugin goals, do
mvn clean install
then
mvn exec:java
or do,
mvn install exec:java
Most likely that the resolution to ClassNotFoundException when using exec-maven-plugin, is to change the default classpath scope (src\main\java), to your test classpath (src\test\java).
It can be passed in the mvn command ( -Dexec.classpathScope="test" ), or in the pom.xml:
<classpathScope>test</classpathScope>
for example:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<phase>test-compile</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>your.package.test.class</mainClass>
<arguments>
...
</arguments>
<classpathScope>test</classpathScope>
</configuration>
</execution>
</executions>
</plugin>
We were facing the same ClassNotFoundException
issues when trying to use the exec:java
plugin from Jenkins. Our compilation was occurring before usage of the plugin, but we were still seeing the exception:
[INFO] --- exec-maven-plugin:3.0.0:java (default-cli) @ org.mycompany.myapp ---
[WARNING]
java.lang.ClassNotFoundException: "org.mycompany.myapp.MyAppEntry"
at java.net.URLClassLoader.findClass (URLClassLoader.java:610)
at java.lang.ClassLoader.loadClassHelper (ClassLoader.java:945)
at java.lang.ClassLoader.loadClass (ClassLoader.java:890)
at java.lang.ClassLoader.loadClass (ClassLoader.java:873)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run (ExecJavaMojo.java:246)
at java.lang.Thread.run (Thread.java:825)
Inspecting the Jenkins workspace showed the class had been compiled as expected, so we were quite puzzled.
The issue turned out to be how the properties were being passed from Jenkins. We had added quotation marks in the "Properties" field of the Maven build step:
exec.mainClass="org.mycompany.myapp.MyAppEntry"
The solution was to remove the quotation marks from Maven build step property config:
exec.mainClass=org.mycompany.myapp.MyAppEntry
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With