2016-11-27 43 views
1

Maven的新手,我試圖使用maven-shade-plugin編譯Maven項目(因爲它似乎是構建胖罐子的最佳插件那裏)。我試圖指定我的主類來創建一個可運行jar文件和一些包含轉換字符串的.properties文件。Maven:使用指定主類和屬性文件的陰影插件編譯項目

編譯和構建似乎過去了,根據netbeans的輸出,但如下(假設Maven的生成JAR更名爲「方案」),我無法運行它:

/usr/bin/java -cp program.jar bot.Main 
> could not find or load main class bot.Main 

這是我的項目文件結構:

project files

,這是我的pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>com.mycompany</groupId> 
<artifactId>mavenproject1</artifactId> 
<version>1.0-SNAPSHOT</version> 
<packaging>jar</packaging> 
<build> 
    <resources> 
    <resource> 
     <directory>src/main/java/resources</directory> 
     <includes> 
      <include>**/*.properties</include> 
     </includes> 
    </resource> 
</resources> 
<plugins> 

    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.4.3</version> 
    <configuration> 
     <archive> 
     <manifest> 
     <addClasspath>true</addClasspath> 
     <classpathPrefix>lib/</classpathPrefix> 
     <mainClass>bot.Main</mainClass> 
     </manifest> 
    </archive> 
    <shadedArtifactAttached>true</shadedArtifactAttached> 
    <shadedClassifierName>launcher</shadedClassifierName> 
    </configuration> 
    <executions> 
     <execution> 
     <phase>package</phase> 
     <goals> 
      <goal>shade</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 

    <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>exec-maven-plugin</artifactId> 
     <version>1.2.1</version> 
     <executions> 
      <execution> 
       <goals> 
        <goal>java</goal> 
       </goals> 
      </execution> 
     </executions> 
     <configuration> 
      <mainClass>bot.Main</mainClass> 
     </configuration> 
    </plugin> 

</plugins> 
</build> 
<dependencies> 
    <dependency> 
     <groupId>org.telegram</groupId> 
     <artifactId>telegrambots</artifactId> 
     <version>2.4.0</version> 
     <classifier>jar-with-dependencies</classifier> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-lang3</artifactId> 
     <version>3.5</version> 
    </dependency> 
</dependencies> 
<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <maven.compiler.source>1.8</maven.compiler.source> 
    <maven.compiler.target>1.8</maven.compiler.target> 
</properties> 
</project> 

資源是否正確包含,爲什麼我無法使用java -jar命令運行我的程序而未指定主類?它說我「無效或損壞的jar文件」,這應該表示不可運行。

另外,爲什麼既不開始指定主類路徑?

回答

1

的問題是與你的陰影插件的配置,這是目前

<configuration> 
    <archive> 
    <manifest> 
     <addClasspath>true</addClasspath> 
     <classpathPrefix>lib/</classpathPrefix> 
     <mainClass>bot.Main</mainClass> 
    </manifest> 
    </archive> 
    <shadedArtifactAttached>true</shadedArtifactAttached> 
    <shadedClassifierName>launcher</shadedClassifierName> 
</configuration> 

沒有<archive>參數的shade goal。事實上,您使用的配置元素不存在is not an error,配置將被忽略,這就解釋了爲什麼您的主類沒有在Manifest中設置。

要使用Shade插件構建可執行JAR,您需要to provide the ManifestResourceTransformer作爲transformers。正確的配置應該是:

<configuration> 
    <transformers> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
     <mainClass>bot.Main</mainClass> 
    </transformer> 
    </transformers> 
    <shadedArtifactAttached>true</shadedArtifactAttached> 
    <shadedClassifierName>launcher</shadedClassifierName> 
</configuration> 

請注意,這個配置中,陰影JAR不會更換主JAR。 shadedArtifactAttached設置爲true,這意味着帶陰影的JAR將作爲輔助工件附加到項目。它將與其主分類器launcher,即shadedClassifierName參數的主JAR區分開來。

在這個項目上運行mvn clean package後,您將擁有創建2個JAR文件:

  • mavenproject1-1.0-SNAPSHOT.jar,這是主要的JAR。該JAR只包含應用程序的已編譯Java源代碼。它不可執行,並且不包含其中的所有依賴類。
  • mavenproject1-1.0-SNAPSHOT-launcher.jar是陰影附加的JAR,它是由Shade插件構建的。這個是可執行的並且包含依賴關係的類。

這意味着,如果你想啓動應用程序作爲一個可執行的JAR,你必須啓動-launcher.jar,而不是另一種,與

java -jar mavenproject1-1.0-SNAPSHOT-launcher.jar 

作爲一個側面說明,兩個JAR都將包含您在<directory>src/main/java/resources</directory>中的資源,因爲它們是項目本身的資源,正如<resource>元素所聲明的。但是,最好是尊重standard directory layout並將資源置於src/main/resources

+0

謝謝!但是當我嘗試啓動它時,我'無法訪問jarfile'錯誤。這是否仍然與陰影插件設置有關? – A7X

+1

@ A7X聽起來你沒有在正確的位置運行'java -jar'命令。 JAR不在您啓動它的目錄中。如果您在項目中,它位於'target'文件夾內,而不是根文件夾。儘管這與Shade插件無關。 – Tunaki

+0

是的,這是我的錯。順便說一下,我仍然得到MissingResourceBundleException無法找到資源。字符串語言環境en_US的包。我使用'ResourceBundle.getBundle(「resources.strings」,新的Locale(「en」,「US」),loader)將它們包含在我的項目中;'是否因爲我將錯誤的文件路徑傳遞給資源?它應該是完整路徑嗎? – A7X

相關問題