簡體   English   中英

使用命令行中的參數從JAR運行Maven項目

[英]Run maven project from JAR with arguments from command line

嗨,我有一個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位於其他類中(在此文件夾/包中)

我認為我應該在堆棧溢出中插入我建議的這種情況下的主類, 在pom文件中進行構建,但這不起作用。

編輯:現在它起作用了,我像在其他overstackflow主題中一樣在POM文件中進行了更改,我插入了以下代碼:

<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 -cp AreYouExample.jar時在類路徑中指定jar,因此還需要將apache-commons lib添加到類路徑中。

通常,在構建和准備分發應用程序時,我會在其中有一個lib目錄並配置maven復制您的依賴項,因此我的啟動腳本可以將它們全部添加到類路徑中並啟動應用程序。

您需要在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自動加載。

如果只運行程序而不告訴Java所有庫類都在哪里,那么您將確切地獲得NoClassDefFoundError

有幾種方法可以正確運行程序。

  • java -jar YourJarFile.jar

此命令需要JAR文件中的清單文件。 此清單必須包含兩個屬性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插件

我前段時間也遇到過類似的問題。 如果您從eclipse運行maven並且未在項目中定義源文件夾,則eclipse maven插件將不知道要編譯什么,因此不會將任何類添加到jar(檢查您的maven日志並查看是否添加了類)。 因此,您應該向自己保證src / main / java已添加到eclipse項目中。 檢查項目屬性的構建路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM