Maven构建抛出java.lang.NoClassDefFoundError
已解决:我的类资源名为TestCounter。。。maven试图测试它。将其重命名为CounterSwitch,构建成功 我是马文的新手,请容忍我。。。我有一些测试在eclipse中运行良好,但在maven构建过程中失败 测试位于:Maven构建抛出java.lang.NoClassDefFoundError,java,eclipse,maven,testing,jacoco,Java,Eclipse,Maven,Testing,Jacoco,已解决:我的类资源名为TestCounter。。。maven试图测试它。将其重命名为CounterSwitch,构建成功 我是马文的新手,请容忍我。。。我有一些测试在eclipse中运行良好,但在maven构建过程中失败 测试位于:src/test/java/main/*.java 测试使用的类只有测试:src/test/java/***.java 测试还需要访问位于以下位置的资源:src/test/resources/packages/etc. 在我的资源中有.java源文件,我没有编译这些文
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>
修正了,问题很明显。。。类/java文件名为TestCounter。。。surefire试图测试他们。将它们重命名为CounterSwitch,构建顺利进行。也有同样的问题,将该文件作为
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>
org.apache.maven.plugins
maven surefire插件
src/main/java/mockprocesss/itclient-counter/bin/main/TestCounter.java
Maven为错误实际提供了什么?您看到的错误可能是在作为测试生命周期步骤一部分的测试执行期间,而不是在构建期间。项目“主要”部分的源文件在哪里?使用maven进行编译,而不是Eclipse。@RyanJ测试开始时(甚至无法执行)。我的测试附带UnitTest.java,maven甚至不尝试运行它们。源文件位于src/main/java/main中。在我添加资源之前,项目正在测试和构建中,所以我肯定缺少一些关键配置。事实上,项目现在构建得很好,只是无法执行任何测试。正如@ThorbjørnRavnAndersen所建议的,您应该使用Maven编译并运行所有必要的步骤。您的问题似乎是它认为“main”是一个包名,而不是文件夹名(“bin”是您的类路径根,而不是“bin/main”,因此您可以在末尾看到“错误的名称”错误)。处理它的Maven应该会帮你解决它<代码>原因:java.lang.NoClassDefFoundError:mockprocesses/itclient counter/bin/main/TestCounter(错误名称:main/TestCounter)@RyanJ对不起,我不知道你说的maven处理它是什么意思。Maven实际上“成功”构建了项目,因为它完全跳过了测试阶段。我知道必须使用外部源文件作为资源(用于JaCoCo报告测试)是很糟糕的,但必须有一个解决方案。我已经尝试在我的pom中为src/test/resources下的所有内容添加exclude标记,但它仍然抛出相同的异常:
<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>