【问题标题】:why is one dependency not packaged with the JAR in Maven project为什么一个依赖项没有与 Maven 项目中的 JAR 一起打包
【发布时间】:2020-01-28 17:04:38
【问题描述】:

编辑:请参阅下面的编辑。这个问题仍然需要注意,因为即使在清理之后,按照建议更改 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

【问题讨论】:

    标签: maven


    【解决方案1】:

    这是因为依赖项仅标记为test 范围,这意味着仅在测试阶段才需要该依赖项。

    使 jar 文件从打包的 jar 文件中排除这些文件的构建过程,并在使用 mvn java:exec ... 启动应用程序时排除该文件。

    要修复它,只需删除 &lt;scope&gt;test&lt;/scope&gt;

    【讨论】:

    • 谢谢,但这并没有改变任何东西。当我尝试运行 java -jar target/&lt;jar name&gt; 时,我编辑了我的问题以包含输出
    • 在执行jar文件之前有没有新建一个jar文件?尝试mvn clean package构建新的jar文件并执行。
    【解决方案2】:

    jar 中的包是否包含在内?另外,你使用了 maven-dependency-plugin 吗?

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

    【讨论】:

    • 我在pom.xml 中没有maven-dependency-plugin,但我只是添加了它,它并没有改变行为。不知道“装在罐子里的包”是什么意思?
    • 您可以打开jar,因为它是一个zip,从而可以查看jar和包含的类等。这样可以验证是否全部打包。
    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    相关资源
    最近更新 更多