【问题标题】:Run maven project from JAR with arguments from command line使用命令行参数从 JAR 运行 maven 项目
【发布时间】:2014-05-04 18:42:39
【问题描述】:

嗨,我有一个 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 构建它到 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)...

我认为跑步者看不到我在程序中使用的库(从数学中获取平均数)

我没有清单文件和类路径文件。当我尝试运行 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... 然后编译器无法找到程序中使用的符号,因为 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>

【问题讨论】:

    标签: java jar


    【解决方案1】:

    您只是在启动应用程序java -cp AreYouExample.jar 时在类路径中指定您的jar,因此您还需要将apache-commons 库添加到类路径中。

    通常在构建和准备要分发的应用程序时,我会有一个 lib 目录并在其中配置 maven 复制您的依赖项,因此我的启动脚本可以将它们全部添加到类路径并启动应用程序。

    【讨论】:

    • 但是如何在java项目中添加classPath呢?
    • 您已经将 jar 添加到类路径 java -cp AreYouExample.jar。您可以在 Windows 上使用 ; 分隔多个 jar,在 *nix 上使用 : 分隔多个 jar,例如 java -cp jar1;jar2;jarN com.sample.MyClass。你可以在这里阅读更多信息:docs.oracle.com/javase/7/docs/technotes/tools/windows/…
    【解决方案2】:

    您需要一个由 maven 创建的 jar 中的 Manifest 文件中的 Main 类。

    Manifest-Version: 1.0
    Main-Class: com.main class name
    

    它显然无法开始执行你的 jar 中的主程序

    Error: Could not find or load main class MainClass.java
    

    创建一个 Manifest 文件并在那里指定您的 Main 类。 然后使用类路径选项 -cp 将任何值传递给您的 jar,如属性文件。 当您从命令行执行 jar 时,maven 将自动加载所有常见的库 jar。

    【讨论】:

      【解决方案3】:

      如果你只运行你的程序而不告诉Java所有库类驻留在哪里,你会得到NoClassDefFoundError

      有几种方法可以正确运行您的程序

      • java -jar YourJarFile.jar

      此命令需要在 JAR 文件中包含 manifest file。此清单必须包含两个属性 Main-ClassClass-Path。对于您的程序,清单文件中的此类路径属性必须包含您正在使用的库

      • java -cp &lt;jar-file&gt; your.pkg.MainClass

      此命令明确说明命令中的类路径,现在必须是您自己的 JAR 文件。然后它还声明了应该运行其主要方法的主类。这意味着您不再需要清单中的 Main-Class 属性。但是您仍然需要 Class-Path 属性来查找使用的库。

      • java -cp &lt;jar-file&gt;;&lt;lib1&gt;;&lt;lib2&gt;;... your.pkg.MainClass

      使用此命令,您不再需要任何显式清单。只需将您自己的 JAR 文件和库放入显式类路径(在命令内)。


      使用 Maven,您可以告诉归档器如何创建清单。此外,您可以让 Maven 创建整个发行版。看看assembly plugin

      【讨论】:

        【解决方案4】:

        前段时间我也遇到过类似的问题。如果你从 eclipse 运行你的 maven 并且你没有在你的项目中定义你的源文件夹,那么你的 eclipse maven 插件将不知道要编译什么,所以不会将类添加到 jar 中(检查你的 maven 日志并查看它添加了你的类)。因此,您应该向自己保证 src/main/java 已添加到 eclipse 项目中。检查您的项目属性构建路径。

        【讨论】:

          猜你喜欢
          • 2018-03-28
          • 2011-04-10
          • 2013-05-08
          • 2016-11-07
          • 1970-01-01
          • 2018-07-16
          • 1970-01-01
          • 2016-12-09
          • 2020-04-01
          相关资源
          最近更新 更多