2016-01-17 9 views
10

मेरे पास नीचे दी गई pom.xml फ़ाइल वाला एक प्रोजेक्ट है। जब मैं कमांड mvn clean compile assembly:single install जारी मैं Maven एक जार, जोProGuard निर्भरता के साथ JAR को खराब नहीं करता

  • सभी निर्भरता और
  • मेरी कोड की समझ से परे संस्करण शामिल उत्पन्न करना चाहते हैं।

यह काम नहीं करता है - मेरा कोड "जार-निर्भरता" फ़ाइल में obfuscated नहीं है।

जब मैं mvn clean compile install चलाता हूं परिणामी फ़ाइल में मेरे आवेदन का obfuscated कोड है, लेकिन कोई निर्भरता नहीं है।

सभी निर्भरताओं और मेरे obfuscated कोड के साथ एक जेएआर फ़ाइल रखने के लिए मैं क्या कर सकता हूं?

<?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> 

अद्यतन 1 (2016/01/17 19:54 एमएसके): ProGuard विन्यास बदल गया नीचे दिखाया गया है की तरह है, लेकिन अभी भी mvn clean compile assembly:single सुलझे वर्ग फाइलों के साथ एक जार पैदा करता है।

<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> 

अद्यतन 2 (2016/01/17 20:29 एमएसके):mvn clean compile assembly:single install विफल रहता है। अंतिम संदेश here देखा जा सकता है।

उत्तर

9

proguard-maven-plugin आपकी परियोजना के प्राथमिक आर्टिफैक्ट को खराब कर देगा, न कि माध्यमिक आर्टिफैक्ट jar-with-dependencies जो maven-assembly-plugin उत्पन्न हुआ था।

आप injar विशेषता निर्दिष्ट द्वारा jar-with-dependencies अंधेरा करना प्लगइन विन्यस्त करने की जरूरत:

आवेदन के इनपुट जार नाम निर्दिष्ट करता है (या युद्ध, कान, ज़िप) संसाधित करने के लिए।

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

अब, वहाँ भी अपने पोम प्लगइन्स के निष्पादन के आदेश में एक समस्या है: हम यह सुनिश्चित करें कि maven-assembly-pluginproguard-maven-plugin से पहले मार डाला जाता है बनाने की जरूरत है। इस प्रकार, के साथ कमांड लाइन से मैन्युअल रूप से इसे आवेदक के बजाय package चरण तक maven-assembly-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> 

और उसके बाद, तुम बस यह सुनिश्चित करें कि proguard-maven-plugin प्लगइन विन्यास है कि आपके पोम के बाद है बनाने की जरूरत है।

ऐसा करने के बाद, mvn clean install के साथ मेवेन का आविष्कार परिणामस्वरूप निर्भरता के साथ एक obfuscated जार होगा।

  • https://repo.spongepowered.org/mavenspongeapi निर्भरता को हल करने:


    अपने वास्तविक पोम के साथ परीक्षण करने के लिए, मैं दो खजाने गयी।

  • http://maven.restlet.comorg.restlet.jse निर्भरताओं को हल करने के लिए।

उन 2 निर्भरता के साथ, चेतावनी ProGuard द्वारा क्योंकि org.restlet.ext.jackson निर्भरता com.sun.msv.* कक्षाएं कि buildpath पर नहीं हैं इस्तेमाल उत्पन्न किया गया। चूंकि मुझे लगता है कि आपका कोड वर्तमान में काम कर रहा है, इसका मतलब है कि उन वर्गों को शामिल करने की आवश्यकता नहीं है और उन चेतावनियों को अनदेखा किया जा सकता है। इस प्रकार, मैंने -dontwarn विकल्प जोड़ा ताकि एक चेतावनी होने पर ProGuard त्रुटि न हो।

अंतिम पोम जिसके लिए मैं सफलतापूर्वक निर्भरता के साथ जार अंधेरा करना करने में सक्षम था निम्नलिखित है:

<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

मैं एक ही मुद्दे के साथ अटक कर रहा हूँ और मैं अपने जवाब नहीं मिलता है। आपको भंडार जोड़ने की आवश्यकता क्यों है? निर्भरता पहले से ही पोम में निर्दिष्ट हैं। प्रोगुर्ड को और क्यों चाहिए? इसके अलावा, आप प्रत्येक निर्भरता के लिए भंडार कहां पाते हैं? क्या आप http://stackoverflow.com/questions/36150297/how-to-assembly-a-project-after-using-proguard-maven-plugin?noredirect=1#comment59941093_36150297 पर एक नज़र डालने पर ध्यान देंगे – Sharcoux

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