使用系统范围时的NoClassDefFoundError

时间:2012-06-21 15:35:06

标签: java maven

我正在使用Maven和NetBeans 7.1时遇到问题 - 我已经包含了一个我无法放入系统范围内的Maven存储库的库。它看起来像下面这样:

 <dependency>
    <groupId>org.company</groupId>
    <artifactId>FBTM</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/FBTM-1.0-SNAPSHOT.jar</systemPath>
</dependency>

IDE似乎很好地接受了这种依赖,就像在Dependencies文件夹(Project视图)中显示的那样,我能够查看jar内容。我也可以从jar中导入类而没有任何问题。

但是,当我尝试运行我的项目(并且运行时有任何正在使用的类)时,我得到了一个NoClassDefFoundError来讨论该类。它可以是任何类。

堆栈跟踪:

Exception in thread "main" java.lang.NoClassDefFoundError: com/company/otaupdate/sim/commands/Select at com.company.fbtranslationlibrary.mc.scripts.UserData$1.<init>(UserData.java:30) at com.company.fbtranslationlibrary.mc.scripts.UserData.<init>(UserData.java:28) at com.company.fbtranslationlibrary.mc.MS.get_profile_script(MuscadeScript.java:80) at com.company.fbtranslationlibrary.mc.MS.access$300(MS.java:16)

任何帮助或指示将不胜感激!

4 个答案:

答案 0 :(得分:2)

对于系统范围:

Maven Doc说:

  

系统

     

此范围与您提供的内容类似   提供明确包含它的JAR。工件总是如此   可用,不会在存储库中查找。

您的IDE以某种方式提供了jar。但是当运行时,需要提供它。

尝试使用默认范围(根本没有范围标记)。

编辑: 如果希望maven保留系统范围,则需要通过类路径提供jar运行时。

答案 1 :(得分:0)

似乎NetBeans应用程序运行器不够智能,无法将此JAR文件放在执行类路径上。

为什么不将此依赖项的JAR和POM文件添加到本地存储库?然后你可以使用常规依赖。

或者,查看是否有一种方法可以为此应用程序调整NetBeans应用程序启动器的运行时类路径。 (我不确定我在这里使用正确的术语......我是一个Eclipse人。)

答案 2 :(得分:0)

我通过为项目创建以下build.xml解决了这个问题:

                                            

    <!-- make the repo dir -->
    <mkdir dir="${m2.home}" />

    <!-- copy libs -->
    <copy  todir="${m2.home}">
        <fileset dir="dist"/>
    </copy>

    <!-- copy pom -->
    <copy  todir="${m2.home}">
        <fileset dir="pom"/>
         <mapper>
            <mapper type="regexp" 
                from="pom.xml" to="${m2.app.name}-${m2.app.ver}.pom" />
        </mapper>
    </copy>

    <!-- use naming policy -->
    <copy  todir="${m2.home}">
        <fileset dir="dist"/>
        <mapper>
            <mapper type="regexp" 
                from="${m2.app.name}.jar" to="${m2.app.name}-${m2.app.ver}.jar" />
        </mapper>
    </copy>

    <!-- remove unnecessiary files -->
    <delete>
    <fileset dir="${m2.home}">
        <include name="${m2.app.name}.jar"/>
        <include name="README.TXT"/>
    </fileset>
    </delete>
</target>

我还必须为项目手动创建一个pom.xml文件,我使用相同的命名约定将其复制到本地存储库。这不是最好的解决方案,但效果还不错。

答案 3 :(得分:0)