2015-11-07 46 views
11

我想混淆罐子的Java郵件嵌入的jar:嵌入式罐子模糊處理罐子

<dependency> 
    <groupId>com.sun.mail</groupId> 
    <artifactId>javax.mail</artifactId> 
    <version>1.5.4</version> 
    <type>jar</type> 
</dependency> 
...... 
<plugin> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>maven-bundle-plugin</artifactId> 
    <version>3.0.0</version> 
    <extensions>true</extensions> 
    <configuration> 
     <instructions> 
      <!-- Embed dependency into the bundle--> 
      <Embed-Dependency>javax.mail;inline=true</Embed-Dependency> 
      <Bundle-Version>${project.version}</Bundle-Version> 
      <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> 
     </instructions> 
    </configuration> 
</plugin> 

Proguard的配置

<plugin> 
    <groupId>com.github.wvengen</groupId> 
    <artifactId>proguard-maven-plugin</artifactId> 
    <version>2.0.11</version> 
    <dependencies> 
     <dependency> 
      <groupId>net.sf.proguard</groupId> 
      <artifactId>proguard-base</artifactId> 
      <version>5.2.1</version> 
     </dependency> 
    </dependencies> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>proguard</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <proguardVersion>5.2.1</proguardVersion> 
     <obfuscate>true</obfuscate> 
     <injarNotExistsSkip>true</injarNotExistsSkip> 
     <injar>${project.build.finalName}.jar</injar> 
     <outjar>${project.build.finalName}.jar</outjar> 
     <options> 
      <option>-keep public class org.package.engine.osgi.impl</option> 
      <option>-keep public interface org.package.engine.osgi</option> 
     </options> 
     <exclusions> 
      <exclusion> 
       <groupId>com.sun.mail</groupId> 
       <artifactId>javax.mail</artifactId> 
      </exclusion> 
     </exclusions> 
     <libs> 
      <lib>${java.home}/lib/rt.jar</lib> 
      <lib>${java.home}/lib/jce.jar</lib> 
      <lib>${java.home}/lib/ext/jfxrt.jar</lib> 
     </libs> 
    </configuration> 
</plugin> 

我在編譯時出現此錯誤

proguard jar: C:\Users\user\.m2\repository\net\sf\proguard\proguard-base\5.2.1\proguard-base-5.2.1.jar 
    [proguard] ProGuard, version 5.2.1  
    [proguard] Reading library jar [C:\Users\user\.m2\repository\org\osgi\org.osgi.core\6.0.0\org.osgi.core-6.0.0.jar] 
    [proguard] Reading library jar [C:\Users\user\.m2\repository\org\apache\karaf\shell\org.apache.karaf.shell.core\4.0.1\org.apache.karaf.shell.core-4.0.1.jar] 
    [proguard] Reading library jar [C:\Users\user\.m2\repository\jline\jline\2.12\jline-2.12.jar]    
    .............   
    [proguard]  Maybe this is library method 'java.util.Comparators$NullComparator { java.util.Comparator reversed(); }' 
    [proguard] Warning: there were 1 instances of library classes depending on program classes. 
    [proguard]   You must avoid such dependencies, since the program classes will 
    [proguard]   be processed, while the library classes will remain unchanged. 
    [proguard]   (http://proguard.sourceforge.net/manual/troubleshooting.html#dependency) 
    [proguard] Error: Please correct the above warnings first. 
    [proguard] Note: there were 5 accesses to class members by means of introspection. 
    [proguard]  You should consider explicitly keeping the mentioned class members 
    [proguard]  (using '-keep' or '-keepclassmembers'). 
    [proguard]  (http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclassmember) 

完全錯誤堆棧http://pastebin.com/hmhv0Yvs

回答

2

沒有嘗試運行您的POM,但正如我所看到的那樣,它會將javax.mail工件提取到您的JAR中,然後混淆包括javax.mail在內的所有JAR,並且出現上述問題。

爲了不提取依賴關係,爲什麼不把它複製到META-INF/lib? AFAIR刪除;inline=true應該這樣做。

+0

哪裏META-INF/lib中的位置? –

2

問題來自proguard-maven-plugin配置中的-keep選件的配置錯誤。您應該添加*通配符,以表明您要保留所提及的包中的所有類/接口(請參閱usage page)。

更正配置是:

<options> 
    <option>-keep public class org.package.engine.osgi.impl.*</option> 
    <option>-keep public interface org.package.engine.osgi.*</option> 
</options> 
+0

不,這不是解決問題 –

+0

@PeterPenzov嗯我試過了,它在一個簡單的程序上工作。你能回到一個非常簡單的案例(刪除/備份你所有的課程)嗎? – Tunaki