使用命令行中的参数从JAR运行maven项目

时间:2014-03-26 11:33:46

标签: java jar

您好我有一个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>

4 个答案:

答案 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-ClassClass-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项目中。检查项目属性构建路径。