Proguard说它找不到任何课程

时间:2012-01-13 03:07:15

标签: java spring maven obfuscation proguard

我正在使用带有spring mvc应用程序和maven的proguard。

我的pom.xml的构建部分如下所示:

<build>
        <finalName>myapp</finalName>
        <plugins>
           <plugin>
                <groupId>com.pyx4me</groupId>
                <artifactId>proguard-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>proguard</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <obfuscate>true</obfuscate>
                    <!--<options>-->
                        <!--<option>-keep public class</option>-->
                    <!--</options>-->
                    <injar>${project.build.finalName}</injar>
                    <injar>${project.build.finalName}</injar>
                    <inFilter>com.myapp.*</inFilter>
                </configuration>
            </plugin>
         </plugins>

我也尝试过:

<injar>${project.build.finalName}.war</injar>

当我跑步时:

mvn clean install

构建失败消息:

[proguard] Reading program war [/Users/me/dev/git/myproject/myapp/target/myapp.war] (filtered)
 [proguard] Error: The input doesn't contain any classes. Did you specify the proper '-injars' options?

ERROR] Failed to execute goal com.pyx4me:proguard-maven-plugin:2.0.4:proguard (default) on project myapp: Obfuscation failed (result=1) -> [Help 1]

似乎已经正确地拿起我的jar作为show之前的消息:

[INFO] --- proguard-maven-plugin:2.0.4:proguard (default) @ myapp ---
[INFO] execute ProGuard [-injars, '/Users/me/dev/gitserver/myproject/myapp/target/myapp.war'(!META-INF/maven/**,com.myapp.*), -outjars, '/Users/me/dev/git/myproject/myapp/target/myapp_pg.war', -libraryjars, ....

另外,您建议我使用哪些选项?这是一个spring mvc,所以我的注释如下:

  1. @Autowired
  2. @服务
  3. @Repository
  4. @Controller
  5. 所以不应该重命名任何这些类/字段。

    (我的目标只是让那些反编译的人头疼,这样他们就不能反编译和使用代码。模糊处理会让他们使用它,但他们将无法维护代码库,除非他们重写了。我没有任何花哨的算法,所以在这方面我没有什么可隐瞒的。)

    更新

    让我在这里说清楚,我的spring mvc因为某种原因使用maven(我是maven的新手),在进行mvn clean install时会产生myapp.war文件和爆炸的战争myapp /(这就是我想要的)在生产中部署,而不是myapp.war文件)

    我的myapp文件夹有:

    /target/myapp/
    /target/myapp/meta-inf (empty folder)
    /target/myapp/web-inf
    /target/myapp/web-inf/classes (com.myapp. ...)
    /target/myapp/web-inf/lib/
    /target/myapp/web-inf/ web.xml, application.xml (for spring)
    /target/myapp/web-inf/views/
    

    所以proguard应该在/ target / myapp / web-inf / classes文件夹中混淆吗? 我怎么告诉它这样做?

    更新2

    我现在收到这个:

    好的,我没有得到:未能执行目标... proguard ..无法重命名/ Users / me / dev / git / project1 / myapp / target / myapp / web-inf / classes(请参阅我的更新我在pom.xml中更改的部分)

    我用:

    更改了我的pom.xml
                <configuration>
                    <obfuscate>true</obfuscate>
    
                    <injar>${project.build.finalName}/WEB-INF/classes/</injar>
                    <inFilter>com/myapp/**</inFilter>
                </configuration>
    

2 个答案:

答案 0 :(得分:5)

ProGuard过滤器处理文件名,所以

.....(!META-INF/maven/**,com.myapp.*)

可能无法匹配任何类文件。你可能想要

.....(!META-INF/maven/**,com/myapp/**)

请参阅ProGuard manual > Usage > File Filters

答案 1 :(得分:1)

你可以张贴整个pom吗?

通常,Maven编译为/ target / classes(即使对于WAR文件),WAR插件在包阶段之前复制到web-inf / classes。您应该使用Maven手动编译到web-inf / lib的类。

编辑:好的,这需要相当多的研究,但我找到了答案。首先,according to the ProGuard documentation,你的战争项目中不应该有任何类:

  

值得注意的是,一个位于WEB-INF / classes目录中的类文件   war应该打包在jar中并放在WEB-INF / lib目录中

您需要重构项目,以便您的Web类构建在一个单独的jar中。一旦构建了jar项目,就必须将它作为依赖项添加到war项目中。

创建该设置后,我成功地使用以下配置构建了war项目:

<build>
        <plugins>
            <plugin>
                <groupId>com.pyx4me</groupId>
                <artifactId>proguard-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>proguard</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <inFilter>com/example/**</inFilter>
                    <libs>
                        <lib>${java.home}/lib/rt.jar</lib>
                        <lib>${java.home}/lib/jsse.jar</lib>
                    </libs>
                    <options>
                        <option>-keep class com.example.echo.EchoServlet</option>
                        <option>-injar ${project.build.directory}/${project.build.finalName}.${project.packaging}</option>
                        <option>-outjar ${project.build.directory}/${project.build.finalName}-proguarded.${project.packaging}</option>
                    </options>
                </configuration>
            </plugin>
        </plugins>
    </build>

请注意“com.example.echo.EchoServlet”。由于progaurd将改变我的类的名称,我必须“保留”这个servlet名称,以便我可以在WAR项目的web.xml中引用它。如果您使用基于注释的servlet配置,我想这不是必需的。