2016-01-17 15 views
10

Tôi có một dự án với tệp pom.xml được cung cấp bên dưới. Khi tôi thực hiện lệnh mvn clean compile assembly:single install Tôi muốn Maven để tạo ra một JAR, trong đó cóProGuard không làm xáo trộn JAR với các phụ thuộc

  • tất cả các phụ thuộc và
  • phiên bản obfuscated mã của tôi.

Nó không hoạt động - mã của tôi không bị che khuất trong tệp "jar-with-dependencies".

Khi tôi chạy mvn clean compile install tệp kết quả chứa mã obfuscated của ứng dụng của tôi, nhưng không phụ thuộc.

Tôi có thể làm gì để có tệp JAR với tất cả các phụ thuộc và mã obfuscated của tôi?

<?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>myproduct</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    <properties> 
     <restlet-version>2.3.5</restlet-version> 
    </properties> 
    <dependencies> 
     <dependency> 
      <groupId>org.spongepowered</groupId> 
      <artifactId>spongeapi</artifactId> 
      <version>3.0.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.12</version> 
     </dependency> 
     <dependency> 
      <groupId>org.easytesting</groupId> 
      <artifactId>fest-assert-core</artifactId> 
      <version>2.0M8</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.mockito</groupId> 
      <artifactId>mockito-core</artifactId> 
      <version>1.10.19</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.restlet.jse</groupId> 
      <artifactId>org.restlet</artifactId> 
      <version>${restlet-version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.restlet.jse</groupId> 
      <artifactId>org.restlet.ext.jackson</artifactId> 
      <version>${restlet-version}</version> 
     </dependency> 
     <dependency> 
      <groupId>com.googlecode.json-simple</groupId> 
      <artifactId>json-simple</artifactId> 
      <version>1.1.1</version> 
     </dependency> 
    </dependencies> 
    <build> 
     <resources> 
      <resource> 
       <directory>${project.basedir}/src/main/resources</directory> 
       <filtering>true</filtering> 
      </resource> 
     </resources> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.3</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>templating-maven-plugin</artifactId> 
       <version>1.0-alpha-3</version> 
       <executions> 
        <execution> 
         <id>filter-src</id> 
         <goals> 
          <goal>filter-sources</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <configuration> 
        <descriptorRefs> 
         <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>com.github.wvengen</groupId> 
       <artifactId>proguard-maven-plugin</artifactId> 
       <version>2.0.8</version> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals><goal>proguard</goal></goals> 
        </execution> 
       </executions> 
       <configuration> 
        <proguardVersion>5.2</proguardVersion> 
        <options> 
         <option>-allowaccessmodification</option> 
         <option>-dontoptimize</option> 
         <option>-dontshrink</option> 
         <option>-dontnote</option> 
         <option>-keepattributes Signature</option> 
         <option>-keep class com.mycompany.MyPlugin { *; }</option> 
        </options> 
        <libs> 
         <lib>${java.home}/lib/rt.jar</lib> 
        </libs> 
        <dependencies> 
         <dependency> 
          <groupId>net.sf.proguard</groupId> 
          <artifactId>proguard-base</artifactId> 
          <version>5.2</version> 
          <scope>runtime</scope> 
         </dependency> 
        </dependencies> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Cập nhật 1 (2016/01/17 19:54 MSK): Thay đổi cấu hình ProGuard như hình dưới đây, nhưng mvn clean compile assembly:single vẫn tạo ra một JAR với các tập tin lớp học không khó hiểu.

<plugin> 
    <groupId>com.github.wvengen</groupId> 
    <artifactId>proguard-maven-plugin</artifactId> 
    <version>2.0.8</version> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals><goal>proguard</goal></goals> 
     </execution> 
    </executions> 
    <configuration> 
     <proguardVersion>5.2</proguardVersion> 
     <options> 
      <option>-allowaccessmodification</option> 
      <option>-dontoptimize</option> 
      <option>-dontshrink</option> 
      <option>-dontnote</option> 
      <option>-keepattributes Signature</option> 
      <option>-keep class com.mycompany.MyPlugin { *; }</option> 
     </options> 
     <injar>${project.build.finalName}-jar-with-dependencies.jar</injar> 
     <libs> 
      <lib>${java.home}/lib/rt.jar</lib> 
     </libs> 
     <dependencies> 
      <dependency> 
       <groupId>net.sf.proguard</groupId> 
       <artifactId>proguard-base</artifactId> 
       <version>5.2</version> 
       <scope>runtime</scope> 
      </dependency> 
     </dependencies> 
    </configuration> 
</plugin> 

Cập nhật 2 (2016/01/17 20:29 MSK):mvn clean compile assembly:single install thất bại. Các tin nhắn cuối cùng có thể được nhìn thấy here.

Trả lời

9

proguard-maven-plugin sẽ làm xáo trộn tạo tác chính của dự án của bạn, chứ không phải tạo phẩm thứ cấp jar-with-dependencies mà tạo maven-assembly-plugin.

Bạn cần phải cấu hình các plugin để xáo trộn những jar-with-dependencies bằng cách xác định các thuộc tính injar:

Chỉ định tên jar đầu vào (hoặc chiến tranh, tai, kéo khóa) của các ứng dụng để được xử lý.

<injar>${project.build.finalName}-jar-with-dependencies.jar</injar> 

Bây giờ, đó cũng là một vấn đề trong thứ tự thực hiện các plugin trong POM của bạn: chúng ta cần phải chắc chắn rằng maven-assembly-plugin được thực hiện trước khi proguard-maven-plugin. Như vậy, tốt nhất là xác định một thực thi rõ ràng cho các maven-assembly-plugin ràng buộc với giai đoạn package thay vì tự gọi nó từ dòng lệnh với assembly:single. Đây sẽ là cấu hình:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>assembly</id> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      <phase>package</phase> 
      <configuration> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

và sau đó, bạn chỉ cần phải chắc chắn rằng cấu hình proguard-maven-plugin plugin là sau đó trong POM của bạn.

Sau khi thực hiện điều đó, hãy gọi Maven với mvn clean install sẽ dẫn đến một lọ bị che khuất với các phụ thuộc.


Để kiểm tra với POM thực tế của bạn, tôi bổ sung thêm hai kho:

  • https://repo.spongepowered.org/maven để giải quyết spongeapi phụ thuộc.
  • http://maven.restlet.com để giải quyết phụ thuộc org.restlet.jse.

Với 2 phụ thuộc đó, cảnh báo đã được tạo bởi ProGuard do phụ thuộc org.restlet.ext.jackson sử dụng com.sun.msv.* các lớp không có trên đường chạy. Vì tôi thấy rằng mã của bạn hiện đang hoạt động, điều đó có nghĩa là các lớp đó không cần phải được bao gồm và những cảnh báo đó có thể bị bỏ qua. Như vậy, tôi đã thêm tùy chọn -dontwarn để ProGuard không báo lỗi khi có cảnh báo.

Các POM thức mà tôi đã có thể xáo trộn thành công jar với phụ thuộc như sau:

<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>myproduct</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <repositories> 
     <repository> 
      <id>spongepowered</id> 
      <url>https://repo.spongepowered.org/maven</url> 
     </repository> 
     <repository> 
      <id>restlet</id> 
      <url>http://maven.restlet.com</url> 
     </repository> 
    </repositories> 
    <properties> 
     <restlet-version>2.3.5</restlet-version> 
    </properties> 
    <build> 
     <resources> 
      <resource> 
       <directory>${project.basedir}/src/main/resources</directory> 
       <filtering>true</filtering> 
      </resource> 
     </resources> 
     <plugins> 
      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.3</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>templating-maven-plugin</artifactId> 
       <version>1.0-alpha-3</version> 
       <executions> 
        <execution> 
         <id>filter-src</id> 
         <goals> 
          <goal>filter-sources</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>assembly</id> 
         <goals> 
          <goal>single</goal> 
         </goals> 
         <phase>package</phase> 
         <configuration> 
          <descriptorRefs> 
           <descriptorRef>jar-with-dependencies</descriptorRef> 
          </descriptorRefs> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>com.github.wvengen</groupId> 
       <artifactId>proguard-maven-plugin</artifactId> 
       <version>2.0.8</version> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals><goal>proguard</goal></goals> 
         <configuration> 
          <injar>${project.build.finalName}-jar-with-dependencies.jar</injar> <!-- make sure to obfuscate the jar with dependencies --> 
          <proguardVersion>5.2</proguardVersion> 
          <options> 
           <option>-allowaccessmodification</option> 
           <option>-dontoptimize</option> 
           <option>-dontshrink</option> 
           <option>-dontnote</option> 
           <option>-dontwarn</option> <!-- added option to ignore com.sun missing classes --> 
           <option>-keepattributes Signature</option> 
           <option>-keep class com.mycompany.MyPlugin { *; }</option> 
          </options> 
          <libs> 
           <lib>${java.home}/lib/rt.jar</lib> 
          </libs> 
          <dependencies> 
           <dependency> 
            <groupId>net.sf.proguard</groupId> 
            <artifactId>proguard-base</artifactId> 
            <version>5.2</version> 
            <scope>runtime</scope> 
           </dependency> 
          </dependencies> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
    <dependencies> 
     <dependency> 
      <groupId>org.spongepowered</groupId> 
      <artifactId>spongeapi</artifactId> 
      <version>3.0.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.12</version> 
     </dependency> 
     <dependency> 
      <groupId>org.easytesting</groupId> 
      <artifactId>fest-assert-core</artifactId> 
      <version>2.0M8</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.mockito</groupId> 
      <artifactId>mockito-core</artifactId> 
      <version>1.10.19</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.restlet.jse</groupId> 
      <artifactId>org.restlet</artifactId> 
      <version>${restlet-version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.restlet.jse</groupId> 
      <artifactId>org.restlet.ext.jackson</artifactId> 
      <version>${restlet-version}</version> 
     </dependency> 
     <dependency> 
      <groupId>com.googlecode.json-simple</groupId> 
      <artifactId>json-simple</artifactId> 
      <version>1.1.1</version> 
     </dependency> 
    </dependencies> 
</project> 
+0

Tôi đang mắc kẹt với cùng một vấn đề và tôi không nhận được câu trả lời của bạn. Tại sao bạn cần phải thêm các kho lưu trữ? Các phụ thuộc đã được chỉ định trong pom. Tại sao Proguard lại cần nhiều hơn? Hơn nữa, nơi nào bạn tìm thấy kho lưu trữ cho mỗi phụ thuộc? Bạn có nhớ xem http://stackoverflow.com/questions/36150297/how-to-assembly-a-project-after-using-proguard-maven-plugin?noredirect=1#comment59941093_36150297 – Sharcoux

Các vấn đề liên quan