Maven构建出现java.lang.NoClassDefFoundError错误。

4
解决方案:我的类资源命名为TestCounter... maven试图对其进行测试。将其重命名为CounterSwitch,构建成功。
我对maven很陌生,请谅解... 我有一些在eclipse中运行良好但在maven构建期间失败的测试。
这些测试位于:src/test/java/main/*.java 这些测试使用仅用于测试的类:src/test/java/**/*.java 这些测试还需要访问位于:src/test/resources/packages/etc...的资源
在我的资源中,有一些.java源文件,我不编译它们,但是在JaCoCo分析测试中使用它们。我使用相对路径的File对象加载这些资源,因为资源加载器坚持使用绝对路径,并导致我的测试失败。
常识告诉我们,相对路径会在构建后发生更改,这就是为什么maven会抛出NoClassDefFoundError异常,但当它遇到其中一个.java文件时,它也会抛出该异常...这可能是尝试编译它或只是巧合。
然而,解决方案可能更方便,因为在maven生命周期中运行这些测试并不是必需的,它们是功能测试,更多地用于它们产生的结果而不是它们的断言,但我不知道如何将它们列入黑名单。
我的两个问题是:如何将不需要的文件从我的maven构建中隔离出来,以及如何将所需的文件包含在我的maven构建中?
我会感激任何帮助...这是我的pom.xml的相关表示(插件使其变得非常冗长),作为参考,它几乎是默认配置,因为我不知道从哪里开始:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.genericpackage</groupId>
    <artifactId>genericartifact</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>genericartifact</name>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

调用栈:

org.apache.maven.surefire.util.SurefireReflectionException: java.lang.reflect.InvocationTargetException; nested exception is java.lang.reflect.InvocationTargetException: null
java.lang.reflect.InvocationTargetException
        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:606)
        at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
        at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
        at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
        at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)
Caused by: java.lang.NoClassDefFoundError: mockprocesses/itclient-counter/bin/main/TestCounter (wrong name: main/TestCounter)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        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:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at org.apache.maven.surefire.util.DefaultDirectoryScanner.loadClass(DefaultDirectoryScanner.java:98)
        at org.apache.maven.surefire.util.DefaultDirectoryScanner.locateTestClasses(DefaultDirectoryScanner.java:78)
        at org.apache.maven.surefire.junit4.JUnit4Provider.scanClassPath(JUnit4Provider.java:174)
        at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:83)
        ... 9 more

2
使用Maven进行编译,而不是Eclipse。 - Thorbjørn Ravn Andersen
@RyanJ 这是堆栈跟踪,测试开始时就失败了,甚至无法执行。我的测试附有UnitTest.java,maven甚至不尝试运行它们。源文件位于src/main/java/main中。在我添加资源之前,该项目测试和构建都很好,因此我必须缺少一些关键配置。实际上,该项目现在构建得很好,只是无法执行任何测试。 - user3823829
正如@ThorbjørnRavnAndersen建议的那样,您应该使用Maven来编译并运行所有必要的步骤。您的问题似乎是它认为“main”是一个包名,而不是一个文件夹名(即“bin”是您的类路径根,而不是“bin/main”,因此在末尾可以看到“错误名称”错误)。使用Maven处理应该可以为您解决问题。Caused by: java.lang.NoClassDefFoundError: mockprocesses/itclient-counter/bin/main/TestCounter (wrong name: main/TestCounter) - Ryan J
@RyanJ 已经解决了,问题很明显...类/Java文件被命名为TestCounter... surefire 试图对其进行测试。将它们重命名为 CounterSwitch 后, 构建顺利完成,没有出现任何问题。 - user3823829
啊,好听到了,我以前也被这个问题困扰过。 - Ryan J
显示剩余2条评论
2个回答

2

问题已经解决,很明显的是...类/Java文件被命名为TestCounter... surefire试图对它们进行测试。将它们重命名为CounterSwitch,构建顺利完成。


1

我遇到了同样的问题,通过将文件包含在maven-surefire-plugin配置中来解决它,如下所示:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <includes>
          <include>src/main/java/mockprocesses/itclient-counter/bin/main/TestCounter.java</include>
        </includes>
    </configuration>
</plugin>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接