【问题标题】:Maven build throws java.lang.NoClassDefFoundErrorMaven 构建抛出 java.lang.NoClassDefFoundError
【发布时间】:2014-07-22 21:07:35
【问题描述】:

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

我对 maven 很陌生,请多多包涵……我有一些测试在 eclipse 中运行良好,但在 maven 构建期间失败了。

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

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

测试还需要访问位于以下位置的资源:@​​987654325@

我的资源中有.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

【问题讨论】:

  • Maven 实际为您提供的错误是什么?您看到的错误可能是在测试执行期间作为测试生命周期步骤的一部分,而不是在构建期间。您的项目“主要”部分的源文件位于何处?
  • 使用maven编译,而不是Eclipse。
  • @RyanJ Here's the stack trace 测试开始时(甚至无法执行。)我的测试附在 UnitTest.java 上,maven 甚至没有尝试运行它们。源文件位于 src/main/java/main。在我添加资源之前,该项目正在测试和构建良好,所以我一定缺少一些关键配置。事实上,该项目现在构建很好,只是无法执行任何测试。
  • 正如@ThorbjørnRavnAndersen 所建议的,您应该使用 Maven 编译并运行所有必要的步骤。您的问题似乎是它认为“main”是包名称,而不是文件夹名称(“bin”是您的类路径根目录,而不是“bin/main”,因此您可以在最后看到“错误名称”错误)。处理它的 Maven 应该为您修复它。 Caused by: java.lang.NoClassDefFoundError: mockprocesses/itclient-counter/bin/main/TestCounter (wrong name: main/TestCounter)
  • @RyanJ 对不起,我不知道您所说的 maven 处理它是什么意思。 Maven 实际上“成功地”构建了项目,因为它完全跳过了测试阶段。我知道必须使用外部源文件作为资源(用于 JaCoCo 报告测试)是废话,但必须有一个解决方案。我已经尝试在我的 pom 中为 src/test/resources 下的所有内容添加排除标签,但它仍然抛出相同的异常:Full maven build output

标签: java eclipse maven testing jacoco


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    遇到了同样的问题,修复了它,将文件作为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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 2018-06-30
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      相关资源
      最近更新 更多