Pergunta

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
Foi útil?

Solução

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

Outras dicas

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top