JavaProGuard说它找不到任何类
我将proguard与SpringMVC应用程序和maven一起使用
我的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]
它似乎正确地拾起了我的罐子,如之前显示的消息所示:
[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在进行mvn清理安装时出于某种原因(我是maven新手)使用maven会产生myapp。war文件和分解的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
我现在明白了:
好的,我不明白:执行目标失败。。。前进的。。无法重命名/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>
# 1 楼答案
ProGuard过滤器处理文件名,所以
可能与任何类文件都不匹配。你可能想要
见ProGuard manual > Usage > File Filters
# 2 楼答案
你能把你所有的pom都发出去吗
通常,Maven编译到/target/classes(甚至对于WAR文件),WAR插件在打包阶段之前复制到web inf/classes。您应该而不是使用Maven手动将类编译为web inf/lib
编辑:好吧,这需要进行大量研究,但我已经为你找到了答案。首先,according to the ProGuard documentation,您的war项目中不应该有任何类:
您需要重构项目,以便将web类构建在单独的jar中。一旦构建了jar项目,就必须将其作为依赖项添加到war项目中
一旦创建了该设置,我就能够成功地使用以下配置构建war项目:
请注意“com.example.echo.EchoServlet”。由于Progord将更改我的类的名称,我必须“保留”这个servlet名称,以便在WAR项目的web中引用它。xml。如果使用基于注释的servlet配置,我想这是不必要的