2017-04-04 152 views
0

我有一個關於maven-assembly-plugin和maven-jar-plugin的執行順序的問題。我想要做的是將一個uberjar文件放在一起構成框架(java的插件框架)。爲了能夠做到這一點,我需要首先將所有代碼與依賴關係進行彙編,然後將清單文件打包到清單文件中,清單文件具有框架所需的特定條目。 在問題"Changing the order of maven plugin execution" 我讀到的答案是,綁定到同一階段的插件的順序是由在pom.xml文件中聲明的順序定義的。現在,我有以下pom.xml文件:maven-assembly-plugin和maven-jar-plugin的執行順序

<?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>org.assembly.test</groupId> 
    <artifactId>assembly-test</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 


    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <java.version>1.8</java.version> 

     <plugin.id>some-plugin</plugin.id> 
     <plugin.class>org.assembly.test.Main</plugin.class> 
     <plugin.version>0.0.1</plugin.version> 
     <plugin.provider>Developers</plugin.provider> 
     <plugin.dependencies /> 
    </properties> 

    <build> 
     <plugins> 

     <!-- Compiler Plugin --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
       <source>${java.version}</source> 
       <target>${java.version}</target> 
      </configuration> 
     </plugin> 

     <!-- Assembly Plugin --> 
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>3.0.0</version> 
      <configuration> 
       <filters> 
        <filter>src/main/assembly/filter.properties</filter> 
       </filters> 
       <descriptors> 
        <descriptor>src/main/assembly/assembly.xml</descriptor> 
       </descriptors> 
      </configuration> 
      <executions> 
       <execution> 
        <id>make-assembly</id> 
        <phase>package</phase> 
        <goals> 
        <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

     <!-- Jar Plugin --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <configuration> 
       <classesDirectory>${project.build.directory}/${project.artifactId}-${project.version}-distro</classesDirectory> 
       <archive> 
        <manifestEntries> 
        <Plugin-Id>${plugin.id}</Plugin-Id> 
        <Plugin-Class>${plugin.class}</Plugin-Class> 
        <Plugin-Version>${plugin.version}</Plugin-Version> 
        <Plugin-Provider>${plugin.provider}</Plugin-Provider> 
        <Plugin-Dependencies>${plugin.dependencies}</Plugin-Dependencies> 
        </manifestEntries> 
       </archive> 
      </configuration> 
     </plugin> 
     </plugins> 
    </build> 

    <dependencies> 

     <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> 
     <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-lang3</artifactId> 
     <version>3.5</version> 
     </dependency> 

     <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.11</version> 
     <scope>test</scope> 
     </dependency> 
    </dependencies> 
</project> 

從pom.xml文件應該很清楚,我想以後Maven的組裝插件運行Maven的JAR-插件。而是我得到以下Maven輸出:

[INFO] Scanning for projects... 
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for org.assembly.test:assembly-test:jar:1.0-SNAPSHOT 
[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-jar-plugin is missing. @ line 82, column 12 
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build. 
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects. 
[WARNING] 
[INFO]                   
[INFO] ------------------------------------------------------------------------ 
[INFO] Building assembly-test 1.0-SNAPSHOT 
[INFO] ------------------------------------------------------------------------ 
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ assembly-test --- 
[INFO] Deleting D:\JavaTools\project_btc\projects\assembly-test\target 
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ assembly-test --- 
[INFO] Using 'UTF-8' encoding to copy filtered resources. 
[INFO] Copying 3 resources 
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ assembly-test --- 
[INFO] Changes detected - recompiling the module! 
[INFO] Compiling 5 source files to D:\JavaTools\project_btc\projects\assembly-test\target\classes 
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ assembly-test --- 
[INFO] Using 'UTF-8' encoding to copy filtered resources. 
[INFO] Copying 0 resource 
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ assembly-test --- 
[INFO] Nothing to compile - all classes are up to date 
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ assembly-test --- 
[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ assembly-test --- 
[WARNING] JAR will be empty - no content was marked for inclusion! 
[INFO] Building jar: D:\JavaTools\project_btc\projects\assembly-test\target\assembly-test-1.0-SNAPSHOT.jar 
[INFO] 
[INFO] --- maven-assembly-plugin:3.0.0:single (make-assembly) @ assembly-test --- 
[INFO] Reading assembly descriptor: src/main/assembly/assembly.xml 
[ERROR] OS=Windows and the assembly descriptor contains a *nix-specific root-relative-reference (starting with slash)/
[INFO] Copying files to D:\JavaTools\project_btc\projects\assembly-test\target\assembly-test-1.0-SNAPSHOT-distro 
[WARNING] Assembly file: D:\JavaTools\project_btc\projects\assembly-test\target\assembly-test-1.0-SNAPSHOT-distro is not a regular file (it may be a directory). It cannot be attached to the project build for installation or deployment. 
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ assembly-test --- 
[INFO] Installing D:\JavaTools\project_btc\projects\assembly-test\target\assembly-test-1.0-SNAPSHOT.jar to D:\JavaTools\maven_repository\org\assembly\test\assembly-test\1.0-SNAPSHOT\assembly-test-1.0-SNAPSHOT.jar 
[INFO] Installing D:\JavaTools\project_btc\projects\assembly-test\pom.xml to D:\JavaTools\maven_repository\org\assembly\test\assembly-test\1.0-SNAPSHOT\assembly-test-1.0-SNAPSHOT.pom 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 4.376 s 
[INFO] Finished at: 2017-04-04T06:04:11+02:00 
[INFO] Final Memory: 21M/168M 
[INFO] ------------------------------------------------------------------------ 

現在從輸出可以看出,Maven的JAR-插件的Maven的組裝插件,這不是我想要的東西之前執行。這樣的訂單的效果是隻有MANIFEST_INF內容的jar文件。

有人可以解釋我在這裏做錯了什麼?

回答

0

一個可能的解決方案是讓POM文件以這樣的方式:

<?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>org.assembly.test</groupId> 
    <artifactId>assembly-test</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 


    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <java.version>1.8</java.version> 

     <plugin.id>some-plugin</plugin.id> 
     <plugin.class>org.assembly.test.Main</plugin.class> 
     <plugin.version>0.0.1</plugin.version> 
     <plugin.provider>Developers</plugin.provider> 
     <plugin.dependencies /> 
    </properties> 

    <build> 
     <plugins> 

     <!-- Compiler Plugin --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
       <source>${java.version}</source> 
       <target>${java.version}</target> 
      </configuration> 
     </plugin> 

     <!-- Assembly Plugin --> 
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>3.0.0</version> 
      <configuration> 
       <filters> 
        <filter>src/main/assembly/filter.properties</filter> 
       </filters> 
       <descriptors> 
        <descriptor>src/main/assembly/assembly.xml</descriptor> 
       </descriptors> 
      </configuration> 
      <executions> 
       <execution> 
        <id>make-assembly</id> 
        <phase>package</phase> 
        <goals> 
        <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

     <!-- Jar Plugin --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <configuration> 
       <classesDirectory>${project.build.directory}/${project.artifactId}-${project.version}-distro</classesDirectory> 
       <archive> 
        <manifest> 
        <mainClass>org.assembly.test.Main</mainClass> 
        </manifest> 
        <manifestEntries> 
        <Plugin-Id>${plugin.id}</Plugin-Id> 
        <Plugin-Class>${plugin.class}</Plugin-Class> 
        <Plugin-Version>${plugin.version}</Plugin-Version> 
        <Plugin-Provider>${plugin.provider}</Plugin-Provider> 
        <Plugin-Dependencies>${plugin.dependencies}</Plugin-Dependencies> 
        </manifestEntries> 
       </archive> 
      </configuration> 
      <executions> 
       <execution> 
        <id>default-jar</id> 
        <phase>verify</phase> 
        <goals> 
        <goal>jar</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
     </plugins> 
    </build> 

    <dependencies> 

     <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> 
     <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-lang3</artifactId> 
     <version>3.5</version> 
     </dependency> 

     <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.11</version> 
     <scope>test</scope> 
     </dependency> 
    </dependencies> 
</project> 

在這裏,我添加的執行部分的maven-JAR-插件到:

<executions> 
    <execution> 
    <id>default-jar</id> 
    <phase>verify</phase> 
    <goals> 
     <goal>jar</goal> 
    </goals> 
    </execution> 
</executions> 

這是很重要將id設置爲默認-jar,因爲在這種情況下默認執行被覆蓋並且設置phase驗證對於maven-jar-plugin要在之後執行maven-assembly-plugin。萬一phase設定爲然後行家-JAR-插件之前行家組裝-插件被處死。