2015-11-07 99 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