ProGuard:混淆后的JAR包无法运行,但未混淆的JAR包可以运行。

4

我有一个项目是另一个项目的一部分。我正在使用Maven构建过程来制作项目的jar包。我使用ProGuard进行混淆处理。我有一些控制器来处理UI请求。

问题:我的问题是未混淆的jar可以工作。所有的控制器都能被命中,但混淆后的jar无法工作(没有任何控制器被命中)。混淆处理有什么问题?

我的Servlet.XML:

<context:component-scan base-package="myPackage.controllers" />
<mvc:annotation-driven />

示例控制器代码:

package myPackage.controllers.information;

import myPackage.beans.InfoBean;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@RestController
@RequestMapping("/information")
public class InformationController {

    @RequestMapping(method = RequestMethod.GET)
    public return_bean getAllInformation() {
        //some logic
    }

    @RequestMapping(value = "/{infoId}", method = RequestMethod.PUT)
    public return_bean updateInformation(@PathVariable String InfoId, @RequestBody InfoBean info) {
        // some logic
    }
}

我的POM.XML文件与ProGuard相关的内容:

<plugin>
    <groupId>com.github.wvengen</groupId>
    <artifactId>proguard-maven-plugin</artifactId>
    <version>2.0.13</version>
    <dependencies>
        <dependency>
            <groupId>net.sf.proguard</groupId>
            <artifactId>proguard-base</artifactId>
            <version>5.2.1</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>proguard</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <maxMemory>576m</maxMemory>
        <obfuscate>true</obfuscate>
        <!-- File with proguard configuration -->
        <proguardInclude>${basedir}/proguard.conf</proguardInclude>
        <libs>
            <lib>${java7home}/jre/lib/rt.jar</lib>
            <lib>${java7home}/jre/lib/jce.jar</lib>
        </libs>
    </configuration>
</plugin>

我的ProGuard.conf文件内容:

-dontnot
-dontwarn
-dontshrink
-dontoptimize
-keep public class * { public protected *;}
-keep class myPackage.controllers.** { public protected *;}
-keepattributes SourceFile,Signature,LineNumberTable,Exceptions, *Annotation*
-keepparameternames
-printmapping '${logFilesPath}/${project.artifactId}.log'

我检查了我的混淆jar,所有的注释都被保留了。 同时,在我的信息包中,我有一些其他的只有包级访问权限的类。所以那些也被混淆了。但是所有的RequestMapping都是公共的,并没有被混淆。 我的运行环境: 1) 我的项目使用Java 1.7,但这个jar包放在运行于Java 1.8上的项目中。
2) ProGuard版本:5.2.1
3) Spring:4.0.9
4) Jackson:1.9.11
(注意:未经混淆的jar正常工作,但混淆后却不能在以上环境下工作)

当混淆的JAR文件启动时,您是否收到任何错误? 您是否收到超时提示? - Zymus
不,它只是在读取和阅读,然后准备输出jar文件。我有遗漏的吗?此外,它会从.m2文件夹中获取一些jar文件。 - SuhasD
1个回答

6
我需要在ProGuard.conf文件中添加以下内容:
-keepdirectories

默认情况下,混淆过程会删除目录条目。这是为了减小jar文件的大小。由于我使用Spring的“component-scan”功能(可能需要目录结构),因此需要保留它以使其正常工作。

我只是想深入了解ClassPathBeanDefinitionScanner,猜测你的提示节省了我很多时间。谢谢 - 现在它可以工作了。 - René Link
谢谢!我曾经苦苦思索了很长时间,试图弄清楚Proguard输出的jar文件和提取并重新打包后的同一jar文件之间的真正内在区别。 - Sebastian Zubrinic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接