2015-11-07 8 views
11

मैं जावा मेल के लिए एम्बेडेड जार के साथ जार अंधेरा करना चाहते हैं:अंधेरा करना जार

<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

अपने पीओएम को चलाने की कोशिश नहीं की, लेकिन जैसा कि मैंने इसे देखा, यह javax.mail आपके जेएआर के लिए आर्टिफैक्ट निकालता है, और फिर javax.mail सहित सभी जेएआर को खराब करता है और आपको ऊपर की समस्याएं मिलती हैं।

इसके बजाय निर्भरता को निकालने की, क्यों 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

@ पीटरपेन्ज़ोव मम्म मैंने कोशिश की और यह एक साधारण कार्यक्रम पर काम किया। क्या आप एक बहुत ही साधारण मामले पर वापस जा सकते हैं (अपनी सभी कक्षाओं को हटा/बैक अप)? – Tunaki

संबंधित मुद्दे