簡體   English   中英

Maven構建拋出java.lang.NoClassDefFoundError

[英]Maven build throws java.lang.NoClassDefFoundError

已解決:我的類資源名為TestCounter ... maven正試圖測試它。 將其重命名為CounterSwitch並且構建成功。

我對maven很新,請耐心等待...我有一些測試在eclipse中運行得很好,但在maven構建期間失敗了。

測試位於: src/test/java/main/*.java

測試使用以下測試類: src/test/java/**/*.java

測試還需要訪問位於: src/test/resources/packages/etc...

在我的資源中是.java源文件,我沒有編譯,但我用於JaCoCo分析測試。 我正在使用相對pathed 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

修復它,問題很明顯......類/ 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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM