2017-02-28 39 views
0

我想要使用maven構建和混淆多模塊項目。我使用陰影插件創建一個包含我自己的所有類文件(每個模塊)的胖jar文件,以便使用proguard-maven-plugin來混淆fat jar,然後使用appassembler插件創建可執行的生成輸出。除了其他模塊依賴關係也出現在appassembler repo目錄中,這是錯誤的,因爲混淆的類已經存在於陰影的jar中。陰影,proguard和appassembler maven插件的組合

我試着定義了其他模塊的依賴關係,然後添加了陰影插件的依賴關係,但陰影插件似乎忽略了它們。

這是pom.xml中的相關部分:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>3.0.0</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <outputFile>${project.build.directory}/${project.build.finalName}-shaded.${project.packaging}</outputFile> 
         <artifactSet> 
          <includes> 
           <include>${project.groupId}:*</include> 
          </includes> 
         </artifactSet> 
        </configuration> 
       </execution> 
      </executions> 
      <dependencies> 
       <dependency> 
        <groupId>${project.groupId}</groupId> 
        <artifactId>module-a</artifactId> 
        <version>${project.version}</version> 
       </dependency> 
       <dependency> 
        <groupId>${project.groupId}</groupId> 
        <artifactId>module-b</artifactId> 
        <version>${project.version}</version> 
       </dependency> 
      </dependencies> 
     </plugin> 

     <plugin> 
      <groupId>com.github.wvengen</groupId> 
      <artifactId>proguard-maven-plugin</artifactId> 
      <version>2.0.13</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>proguard</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <injar>${project.build.finalName}-shaded.${project.packaging}</injar> 
       <outjar>${project.build.finalName}.${project.packaging}</outjar> 
       <proguardInclude>proguard.pro</proguardInclude> 
       <maxMemory>1024m</maxMemory> 
       <libs> 
        <lib>${java.home}/lib/rt.jar</lib> 
        <lib>${java.home}/lib/jce.jar</lib> 
       </libs> 
      </configuration> 
     </plugin> 

     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>appassembler-maven-plugin</artifactId> 
      <version>2.0.0</version> 
      <executions> 
       <execution> 
        <id>assemble</id> 
        <phase>package</phase> 
        <goals> 
         <goal>assemble</goal> 
        </goals> 
        <configuration> 
         <programs> 
          <program> 
           <mainClass>my.package.Application</mainClass> 
          </program> 
         </programs> 
         <useWildcardClassPath>true</useWildcardClassPath> 
         <repositoryLayout>flat</repositoryLayout> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

任何想法都歡迎。

+0

哪裏是你的pom.xml?你使用了什麼命令?你能提供Maven輸出嗎? – Adonis

+0

@Asettouf mvn乾淨安裝。構建是成功的,但陰影的jar不包含模塊-a和模塊-B類 – raven

回答

1

我發現了一個解決方案,它是不是很方便,因爲我喜歡,但會比其手動刪除其他模塊罐子更好。我使用assembly插件從構建分佈zip中排除罐子。

的pom.xml:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>3.0.0</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <outputFile>${project.build.directory}/${project.build.finalName}-shaded.${project.packaging}</outputFile> 
         <artifactSet> 
          <includes> 
           <include>${project.groupId}:*</include> 
          </includes> 
         </artifactSet> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

     <plugin> 
      <groupId>com.github.wvengen</groupId> 
      <artifactId>proguard-maven-plugin</artifactId> 
      <version>2.0.13</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>proguard</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <injar>${project.build.finalName}-shaded.${project.packaging}</injar> 
       <outjar>${project.build.finalName}.${project.packaging}</outjar> 
       <proguardInclude>proguard.pro</proguardInclude> 
       <maxMemory>1024m</maxMemory> 
       <libs> 
        <lib>${java.home}/lib/rt.jar</lib> 
        <lib>${java.home}/lib/jce.jar</lib> 
       </libs> 
      </configuration> 
     </plugin> 

     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>appassembler-maven-plugin</artifactId> 
      <version>2.0.0</version> 
      <executions> 
       <execution> 
        <id>assemble</id> 
        <phase>package</phase> 
        <goals> 
         <goal>assemble</goal> 
        </goals> 
        <configuration> 
         <programs> 
          <program> 
           <mainClass>my.package.Application</mainClass> 
          </program> 
         </programs> 
         <useWildcardClassPath>true</useWildcardClassPath> 
         <repositoryLayout>flat</repositoryLayout> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>3.0.0</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
        <configuration> 
         <descriptors> 
          <descriptor>descriptor.xml</descriptor> 
         </descriptors> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

descriptor.xml:

<assembly xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" 
     xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd"> 
<id>distribution</id> 
<formats> 
    <format>zip</format> 
</formats> 
<fileSets> 
    <fileSet> 
     <directory>${project.build.directory}/appassembler</directory> 
     <excludes> 
      <exclude>**/module-a-${project.version}.${project.packaging}</exclude> 
      <exclude>**/module-b-${project.version}.${project.packaging}</exclude> 
     </excludes> 
     <outputDirectory>/</outputDirectory> 
    </fileSet> 
</fileSets> 

0

我認爲你的問題來自陰影的jar和appassembler在同一階段運行,

我想你應該嘗試修改appassembler插件的階段:

<phase>post-package</phase> 
+0

我不認爲這個maven有後期封裝階段。但我不認爲這是問題,因爲我的目標中的$ {project.build.finalName} -shaded。$ {project.packaging}文件也不包含module-a和module-b類。 AFAIK maven以pom – raven

+0

的順序執行相同的階段執行。請參閱:https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html。對於每個階段X,您都有一個X前,X後和X階段的階段。如果你不想使用post-package,你可以使用安裝階段,雖然 – Adonis

+0

我沒有找到你在那個鏈接中提到的東西。請參閱http://stackoverflow.com/questions/26607834/maven-lifecycle-vs-phase-vs-plugin-vs-goal。但是儘管如此,在appassembler(或任何其他隨機詞)的post-package或install階段構建項目奇怪並沒有導致任何錯誤,但仍產生相同的輸出。 – raven