为什么在Maven项目中JAR不打包一个依赖项

时间:2020-01-23 00:06:36

标签: maven

编辑:请参见下面的编辑。这个问题仍然需要引起注意,因为按照建议更改pom并不会改变行为,即使经过清洗也是如此。

我有一个Java Maven项目,该项目带有一个插件来生成一个独立的JAR,到目前为止,它已经运行良好。在pom.xml中,

        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>ptcs.App</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

我最近想使用org.apache.commons.math3中的Fraction类,因此我做了以下工作。在我的代码中,

import org.apache.commons.math3.fraction.Fraction;

向pom.xml添加依赖项,

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-math3</artifactId>
        <version>3.6.1</version>
    </dependency>

编辑:最初的测试在pom中,但是我将其删除了。行为没有改变。我还清理了项目。

我正在使用VS Code,它在public static void main上方放置了一个小的“运行”按钮。该运行按钮有效,但是尝试运行JAR报告时,没有Fraction的类定义。同时运行mvn java:exec ...会报告相同的问题。

我在做什么错,为什么在添加此依赖项之前它能完美地工作?

运行JAR时遇到的错误是

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache 
/commons/math3/fraction/Fraction
    at ptcs.App.main(App.java:39)
Caused by: java.lang.ClassNotFoundException:        
org.apache.commons.math3.fraction.Fraction
    at

java.base / jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) 在 java.base / jdk.internal.loader.ClassLoaders $ AppClassLoader.loadClass(ClassLo

aders.java:178)

    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)

    ... 1 more

2 个答案:

答案 0 :(得分:3)

那是因为该依赖项仅被标记为作用域test,这意味着该依赖项仅在测试阶段才需要。

使jar文件的生成过程从打包的jar文件中排除这些文件,并在以mvn java:exec ...启动应用程序时也将该文件排除在外。

要解决此问题,只需删除<scope>test</scope>

答案 1 :(得分:0)

罐子中的包装是否装好?此外,您是否使用过maven-dependency-plugin?

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.10</version>
            </plugin>