【问题标题】:Unable to get Proguard obfuscator and Sprint Boot to work together无法让 Proguard 混淆和 Spring Boot 一起工作
【发布时间】:2016-08-18 17:33:49
【问题描述】:

总结

我一直试图让ProguardSpring-boot 一起为obfuscation 工作,但在使用maven 构建后无法让Spring-boot 运行。我已经搜索并发现有人在谈论相同的问题,但我没有看到它已解决。

我有 2 个应用程序。

  • A2 需要 A1
  • A1

我只需要将obfuscation 构建到 A2 中,但理想情况下我想将它构建到两者中。

我正在创建一个 executable Spring-boot jar 来运行 A1 和 A3。

我可以让maven 打包并创建executable jar,但是当我运行它时,我得到下面的堆栈跟踪说compressed and nested jar files must be stored without compression

问题

如何在不压缩嵌套 jar 的情况下让 proguard 构建我的应用程序?

谢谢

堆栈跟踪

   Exception in thread "main" java.lang.IllegalStateException: Unable to open    nested entry 'BOOT-INF/lib/commons-lang3-3.4.jar'. It has been compressed and nested jar files must be stored without compression. Please check the mechanism  used to create your executable jar file
        at org.springframework.boot.loader.c.k.e(JarFile.java:285)
        at org.springframework.boot.loader.c.k.c(JarFile.java:260)
        at org.springframework.boot.loader.c.k.a(JarFile.java:248)
        at org.springframework.boot.loader.c.k.a(JarFile.java:237)
        at org.springframework.boot.loader.a.c.a(JarFileArchive.java:103)
        at org.springframework.boot.loader.a.c.a(JarFileArchive.java:87)
        at org.springframework.boot.loader.a.c(ExecutableArchiveLauncher.java:72)
        at org.springframework.boot.loader.c.a(Launcher.java:49)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:58)

POM 插件详情

<plugin>
   <groupId>com.github.wvengen</groupId>
   <artifactId>proguard-maven-plugin</artifactId>
   <version>2.0.13</version>
   <executions>
      <execution>
         <id>proguard</id>
         <phase>package</phase>
         <goals>
            <goal>proguard</goal>
         </goals>
      </execution>
   </executions>
   <configuration>
      <!-- File with proguard configuration -->
      <proguardInclude>${basedir}/proguard.conf</proguardInclude>
      <obfuscate>true</obfuscate>
      <libs>
         <lib>${java.home}/lib/rt.jar</lib>
         <lib>${java.home}/lib/jce.jar</lib>
      </libs>
      <options>
         <option>-optimizations !class/marking/final</option>
         <option>-adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF,META-INF/spring.*</option>
         <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod</option>
         <option>-keepclasseswithmembers public class * { public static void main(java.lang.String[]);}</option>
      </options>
   </configuration>
   <dependencies>
      <dependency>
         <groupId>net.sf.proguard</groupId>
         <artifactId>proguard-base</artifactId>
         <version>5.2.1</version>
         <scope>runtime</scope>
      </dependency>
   </dependencies>
</plugin>

Proguard.conf

# Don't obfuscate or remove your entry point
-keep public class com.something.InitialRunner{public static void main(java.lang.String[]);}

-ignorewarnings
-dontoptimize
-dontshrink


# Uncomment if you want to have more meaningful backtraces
# Useful for obfuscation debugging
# You absolutely must keep this commented out for production
#-keepattributes SourceFile,LineNumberTable

【问题讨论】:

  • 在 Maven 中,您是否将所有依赖项放入单个 jar 中执行?这可能是问题所在。我一直不得不将 Spring 库保存在可执行 jar 之外,以便它们正常工作。
  • @JRSofty 是的,我试图让它构建一切,包括 Spring 和我所有的库。您如何设置构建以排除这些库并在运行时使用它们?您是在构建没有弹簧库的混淆 jar,然后重建以使用该 jar 和弹簧生成一个可执行文件吗?谢谢
  • 可能是 maven 正在执行压缩。您可能需要查看文档。一项检查是在没有 proguard 的情况下编译并查看 jar 是否运行或抛出相同的异常。
  • @JRSofty 该应用程序在没有 Proguard 的情况下运行良好。这仅在添加时发生。你是如何在 proguard 中没有 spring 的情况下构建你的应用程序的,你可以通过 proguard 设置发布或发送电子邮件给 aaronmagi@gmail.com 一个示例 pom。谢谢

标签: java spring maven spring-boot proguard


【解决方案1】:

正如我们在上面的 cmets 中所讨论的,这就是我的处理方式。

第一步:使用 maven-dependency-plugin 将您的依赖项复制到外部文件夹,如下所示:

 <build>
   <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-dependency-plugin</artifactId>
         <executions>
           <execution>
             <id>copy-dependencies</id>
             <phase>package</phase>
             <goals>
               <goal>copy-dependencies</goal>
             </goals>
             <configuration>
               <outputDirectory> 
                 ${project.build.directory}/libs
               </outputDirectory>
               <overWriteReleases>false</overWriteReleases>
               <overWriteSnapshots>true</overWriteSnapshots>
               <overWriteIfNewer>true</overWriteIfNewer>
               <includeScope>runtime</includeScope>
              </configuration>
            </execution>
          </executions>
        </plugin>
    </plugins>
  </build>  

第二步:使用 Maven 来执行你的 proguard。现在我不确定你用的是哪个 proguard 插件,我用的是 wvengen 的那个。

    <plugin>
       <groupId>com.github.wvengen</groupId>
       <artifactId>proguard-maven-plugin</artifactId>
       <version>2.0.12</version>
       <executions>
         <execution>
           <phase>package</phase>
           <goals>
             <goal>proguard</goal>
           </goals>
           <configuration>
             <obfuscate>true</obfuscate>
             <outputDirectory>target</outputDirectory>
             <proguardInclude>proguard.conf</proguardInclude>
             <libs>
               <lib>C:\Program Files\Java\jre1.8.0_65/lib/rt.jar</lib>
               <lib>C:\Program Files\Java\jre1.8.0_65/lib/jsse.jar</lib>
             </libs>
           </configuration>
         </execution>
       </executions>
    </plugin>

第三步:检查你的依赖项是否列在 proguard.conf 文件中

# Use -libraryjars to list every jar found in the target/libs folder.

# Don't obfuscate or remove your entry point
-keep public class com.something.InitialRunner{public static void main(java.lang.String[]);}

-ignorewarnings
-dontoptimize
-dontshrink


# Uncomment if you want to have more meaningful backtraces
# Useful for obfuscation debugging
# You absolutely must keep this commented out for production
#-keepattributes SourceFile,LineNumberTable

鉴于可能有一种方法可以使用 Maven 自动执行此操作,这样您就不必手动添加它们,但这就是我处理它的方式。一旦我在混淆之前阻止 Spring 被包装在主 jar 中,那么应用程序就可以正常运行了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多