编辑:请参见下面的编辑。这个问题仍然需要引起注意,因为按照建议更改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
答案 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>