Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Class Not Found exception with exec-maven-plugin when run on Linux

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
like image 344
praneel Avatar asked Jul 03 '13 21:07

praneel


4 Answers

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
like image 197
praneel Avatar answered Nov 06 '22 03:11

praneel


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
like image 27
prime Avatar answered Nov 06 '22 03:11

prime


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>
like image 17
Noam Manos Avatar answered Nov 06 '22 03:11

Noam Manos


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
like image 2
trebor Avatar answered Nov 06 '22 02:11

trebor