java - Maven 构建抛出 java.lang.NoClassDefFoundError

标签 java eclipse maven testing jacoco

已解决:我的类资源名为 TestCounter...maven 正在尝试测试它。将其重命名为 CounterSwitch 并构建成功。

我是 maven 的新手,请耐心等待...我有一些测试在 eclipse 中运行良好,但在 maven 构建过程中失败。

测试在:src/test/java/main/*.java

测试使用仅测试类:src/test/java/**/*.java

测试还需要访问位于以下位置的资源:src/test/resources/packages/etc...

我的资源中有 .java 源文件,我编译这些文件,但它们用于JaCoCo 分析测试。我正在使用相对路径文件对象加载这些资源,因为资源加载器坚持使用绝对路径并导致我的测试失败。

常识表明相对路径在构建后会发生变化,这就是 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

最佳答案

修复它,问题很明显...类/java 文件被命名为 TestCounter...surefire 正在尝试测试它们。将它们重命名为 CounterSwitch,构建顺利进行。

关于java - Maven 构建抛出 java.lang.NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24897865/

相关文章:

java - UML 类图中的通配符

JAVA:更改日历对象的时区而不更改日期/时间时的奇怪行为

java - Eclipse 和 Gradle 的包和 HTML 编辑器问题

maven - 在 Java EE7 项目中找不到 web.xml

eclipse - EL 标签未渲染

java - 通过 Spring MVC 下载大文件

Java:我是否过度简化了代码?

java - IntelliJ IDEA 14 无法使用 Tomcat 运行 Spring 项目,但使用 Eclipse 可以顺利运行

apache-flex - 如何在IDE或构建脚本中对Flex应用程序进行单元测试?

java - 如何使用 Maven 安装 Slick2d?