我正在使用带有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,所以我的注释如下:
所以不应该重命名任何这些类/字段。
(我的目标只是让那些反编译的人头疼,这样他们就不能反编译和使用代码。模糊处理会让他们使用它,但他们将无法维护代码库,除非他们重写了。我没有任何花哨的算法,所以在这方面我没有什么可隐瞒的。)
更新
让我在这里说清楚,我的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>
答案 0 :(得分:5)
ProGuard过滤器处理文件名,所以
.....(!META-INF/maven/**,com.myapp.*)
可能无法匹配任何类文件。你可能想要
.....(!META-INF/maven/**,com/myapp/**)
答案 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配置,我想这不是必需的。