2012-01-13 27 views
7

Tôi đang sử dụng proguard với một ứng dụng mvc mùa xuân và maven.Proguard nói rằng nó không thể tìm thấy bất kỳ lớp học

phần xây dựng pom.xml của tôi trông giống như:

<build> 
     <finalName>myapp</finalName> 
     <plugins> 
      <plugin> 
       <groupId>com.pyx4me</groupId> 
       <artifactId>proguard-maven-plugin</artifactId> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>proguard</goal> 
         </goals> 
        </execution> 
       </executions> 
       <configuration> 
        <obfuscate>true</obfuscate> 
        <!--<options>--> 
         <!--<option>-keep public class</option>--> 
        <!--</options>--> 
        <injar>${project.build.finalName}</injar> 
        <injar>${project.build.finalName}</injar> 
        <inFilter>com.myapp.*</inFilter> 
       </configuration> 
      </plugin> 
     </plugins> 

Tôi cũng đã cố gắng:

<injar>${project.build.finalName}.war</injar> 

Khi tôi chạy:

mvn clean install 

xây dựng thông báo lỗi:

[proguard] Reading program war [/Users/me/dev/git/myproject/myapp/target/myapp.war] (filtered) 
[proguard] Error: The input doesn't contain any classes. Did you specify the proper '-injars' options? 

ERROR] Failed to execute goal com.pyx4me:proguard-maven-plugin:2.0.4:proguard (default) on project myapp: Obfuscation failed (result=1) -> [Help 1] 

Nó dường như đã nhặt jar của tôi một cách chính xác như những thông điệp trước khi hiển thị:

[INFO] --- proguard-maven-plugin:2.0.4:proguard (default) @ myapp --- 
[INFO] execute ProGuard [-injars, '/Users/me/dev/gitserver/myproject/myapp/target/myapp.war'(!META-INF/maven/**,com.myapp.*), -outjars, '/Users/me/dev/git/myproject/myapp/target/myapp_pg.war', -libraryjars, .... 

Ngoài ra, những tùy chọn bạn có đề nghị tôi sử dụng không? Đây là một MVC mùa xuân vì vậy tôi có chú thích như:

  1. @Autowired
  2. @Service
  3. @Repository
  4. @Controller

Vì vậy, bất kỳ của những lớp học/lĩnh vực không nên được đổi tên thành tôi sẽ tưởng tượng.

(Mục tiêu của tôi là làm cho nó trở nên đau đầu đối với một người nào đó dịch ngược lại, như vậy họ không thể dịch ngược và sử dụng mã này. Chúng sẽ không cho phép họ sử dụng mã đó. trừ khi họ lại viết nó. tôi không có bất kỳ thuật toán ưa thích vì vậy tôi không có gì thực sự ẩn mình trong sự tôn trọng điều đó.)

cập nhật

Hãy để tôi được rõ ràng ở đây, MVC mùa xuân của tôi sử dụng maven cho một số lý do (tôi mới maven) khi thực hiện một cài đặt sạch mvn sản xuất cả một tập tin myapp.war và một chiến tranh nổ myapp/(đây là những gì tôi muốn triển khai trong sản xuất, không phải là tập tin myapp.war)

thư mục myapp của tôi có:

/target/myapp/ 
/target/myapp/meta-inf (empty folder) 
/target/myapp/web-inf 
/target/myapp/web-inf/classes (com.myapp. ...) 
/target/myapp/web-inf/lib/ 
/target/myapp/web-inf/ web.xml, application.xml (for spring) 
/target/myapp/web-inf/views/ 

Vì vậy Proguard nên obfuscating trong thư mục/mục tiêu/myapp/web-inf/classes thư mục phải không? Làm thế nào để tôi yêu cầu nó làm như vậy?

Cập nhật 2

Tôi nhận này ngay bây giờ:

OK, tôi không nhận được: thất bại trong việc thực hiện mục tiêu ... Proguard .. Không thể đổi tên/Users/me/dev/git/project1/myapp/target/myapp/web-inf/lớp học (xem phần cập nhật của tôi cho những gì tôi đã thay đổi trong pom.xml của tôi)

Tôi đã thay đổi pom của mình.xml với:

  <configuration> 
       <obfuscate>true</obfuscate> 

       <injar>${project.build.finalName}/WEB-INF/classes/</injar> 
       <inFilter>com/myapp/**</inFilter> 
      </configuration> 
+0

Xem câu trả lời và giải pháp của tôi bên dưới, ProGuard không hỗ trợ cấu hình cụ thể này –

Trả lời

5

ProGuard bộ lọc làm việc trên tên tập tin, vì vậy

.....(!META-INF/maven/**,com.myapp.*) 

có thể sẽ không phù hợp với bất kỳ tập tin lớp. Bạn có thể muốn

.....(!META-INF/maven/**,com/myapp/**) 

Xem ProGuard manual > Usage > File Filters

+0

Ah, vâng, không nhận thấy điều đó trong câu hỏi trước của anh ấy (bắt đầu như một câu hỏi khác). –

+0

Tôi làm cách nào để chỉ bảo vệ cho cuộc chiến bùng nổ của mình chứ không phải là tệp chiến tranh? tức là '/ target/myapp/WEB-INF/classes /' – Blankman

+0

Tôi đang bối rối, liệu nó có mong đợi 'meta-inf/maven /' có thư mục lớp của tôi trong đó không? hoặc là nó kiểm tra các gói? – Blankman

1

Bạn có thể gửi toàn bộ pom của bạn?

Thông thường, Maven biên dịch/target/classes (Ngay cả đối với tệp WAR) và plugin WAR thực hiện sao chép vào web-inf/classes ngay trước giai đoạn gói. Bạn nên không phải là được tự biên soạn các lớp học thành web-inf/lib với Maven.

CHỈNH SỬA: OK điều này có khá nhiều nghiên cứu, nhưng tôi đã tìm thấy câu trả lời cho bạn. Thứ nhất, according to the ProGuard documentation, bạn không nên có BẤT CỨ lớp học trong dự án chiến tranh của bạn:

Đáng chú ý, các file lớp mà là trong/classes thư mục WEB-INF trong một cuộc chiến tranh nên được đóng gói trong một cái lọ và đưa vào thư mục WEB-INF/lib

Bạn cần phải cấu trúc lại dự án của bạn để các lớp web của bạn được xây dựng trong một cái bình riêng biệt. Một khi bạn đã xây dựng dự án jar đó, bạn phải thêm nó như là một sự phụ thuộc trong dự án chiến tranh của bạn.

Khi tôi tạo ra thiết lập đó, tôi đã thành công có thể xây dựng một dự án chiến tranh với các cấu hình sau:

<build> 
     <plugins> 
      <plugin> 
       <groupId>com.pyx4me</groupId> 
       <artifactId>proguard-maven-plugin</artifactId> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>proguard</goal> 
         </goals> 
        </execution> 
       </executions> 
       <configuration> 
        <inFilter>com/example/**</inFilter> 
        <libs> 
         <lib>${java.home}/lib/rt.jar</lib> 
         <lib>${java.home}/lib/jsse.jar</lib> 
        </libs> 
        <options> 
         <option>-keep class com.example.echo.EchoServlet</option> 
         <option>-injar ${project.build.directory}/${project.build.finalName}.${project.packaging}</option> 
         <option>-outjar ${project.build.directory}/${project.build.finalName}-proguarded.${project.packaging}</option> 
        </options> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

Lưu ý "com.example.echo.EchoServlet". Vì progaurd sẽ thay đổi tên của các lớp của tôi, tôi phải "giữ" tên servlet này để tôi có thể tham chiếu nó trong tệp web.xml của dự án WAR. Nếu bạn sử dụng cấu hình servlet dựa trên chú thích, tôi tưởng tượng điều này sẽ không cần thiết.

+0

Với chú thích, anh ta sẽ phải -keepattributes, bởi vì proguard dải chúng theo mặc định. – jackrabbit

+0

ok Tôi sẽ thử điều này, cảm ơn sự giúp đỡ của bạn. Tôi đã cố gắng chỉ proguard để các mục tiêu/lớp học như bạn đề nghị b4 và điều đó đã không làm việc, cùng một lỗi nói không thể đổi tên thư mục. – Blankman

+0

cũng dang, tiền thưởng hết hạn: (Tôi hy vọng câu trả lời này vẫn giải quyết được vấn đề của bạn. Hãy chắc chắn chấp nhận nếu nó hoạt động hoặc nếu bạn cần bất kỳ sự trợ giúp nào trong việc thiết lập dự án maven khác! –

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