您好我有一个maven项目使用了三个库:junit,commons-lang,org.apache.commons 我的程序位于pl.parser.example.MainClass(使用main方法)和其他三个位置:Currency.java,CurrencyPojo.java,CurrencyRates.java
我的主要方法:
public static void main(String[] args){
try {
String type = "c";
String currencyCode = args[0];
String inputStartDate = args[1];
String inputEndDate = args[2];
...
我无法从命令行运行此程序,我使用maven to jar文件构建它并尝试:
java -cp AreYouExample.jar pl.parser.example.MainClass EUR 2013-01-28 2013-01-31
但我有例外:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/ma
th3/stat/descriptive/DescriptiveStatistics
at pl.parser.example.CurrencyRates.obtainAvgPurchaseRate(
CurrencyRates.java:33)
at pl.parser.example.MainClass.main(MainClass.java:34)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.math3.stat.descr
iptive.DescriptiveStatistics
at java.net.URLClassLoader$1.run(Unknown Source)...
我认为跑步者看不到我在程序中使用的库(从数学中得到averange计数)
我没有清单文件和classpath文件。当我尝试运行jar时:
...> java MainClass EUR 2013-01-28 2013-01-31
然后我得到了例外:
Error: Could not find or load main class MainClass.java
但是当我去MainClass.java的文件夹并运行javaC MainClass.java ...然后compiller无法找到程序中使用的符号,因为sumbols位于其他类(在此文件夹/包中)
我认为我应该在堆栈溢出build in pom file中插入一个主要类我建议这个案例,但那不起作用。
编辑: 现在它可以工作,我在POM文件中进行了更改,就像在other overstackflow topic中一样 我插入此代码:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>your.main.Class</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
答案 0 :(得分:0)
当您启动应用java -cp AreYouExample.jar
时,您只在类路径中指定了jar,因此您还需要将apache-commons
lib添加到类路径中。
通常在构建和准备应用程序以进行分发时,我会有一个lib目录并配置maven复制您的依赖项,因此我的启动脚本可以将它们全部添加到类路径并启动应用程序。
答案 1 :(得分:0)
你需要在你的jar中由maven创建的Manifest文件中的Main类。
Manifest-Version: 1.0
Main-Class: com.main class name
显然无法开始执行jar中的主程序
Error: Could not find or load main class MainClass.java
创建清单文件并在那里指定您的Main类。 然后使用classpath选项-cp将任何值传递给jar,就像属性文件一样。 当您从命令行执行jar时,所有公共库jar都将由maven自动加载。
答案 2 :(得分:0)
如果您只运行程序而不告诉Java所有库类所在的位置,那么您将完全得到NoClassDefFoundError
。
有几种方法可以正确运行程序 。
java -jar YourJarFile.jar
此命令在JAR文件中需要manifest file。此清单必须包含两个属性Main-Class
和Class-Path
。对于您的程序,清单文件中的此类路径属性必须包含您正在使用的库
java -cp <jar-file> your.pkg.MainClass
此命令明确说明命令中的类路径,该路径现在必须只是您自己的JAR文件。然后它还说明了主类,它的主要方法应该运行。这意味着您不再需要清单中的Main-Class属性。但是仍然需要Class-Path属性来查找使用过的库。
java -cp <jar-file>;<lib1>;<lib2>;... your.pkg.MainClass
使用此命令,您不再需要任何显式清单。只需将您自己的JAR文件和库放入重复的类路径(在comman中)。
使用Maven,您可以告诉归档者如何创建清单。此外,您可以让Maven创建整个发行版。看看assembly plugin。
答案 3 :(得分:0)
前段时间我遇到过类似的问题。如果你从eclipse运行你的maven并且你没有在你的项目中定义你的源文件夹那么你的eclipse maven插件将不知道要编译什么,所以没有类添加到jar(检查你的maven日志并看到它添加你的类)。所以你应该向自己保证src / main / java被添加到eclipse项目中。检查项目属性构建路径。