【问题标题】:Proguard is saying it can't find any classesProguard 说它找不到任何类
【发布时间】:2012-01-13 03:07:14
【问题描述】:

我正在将 proguard 与 spring mvc 应用程序和 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,所以我有如下注释:

  1. @Autowired
  2. @服务
  3. @Repository
  4. @Controller

所以我想这些类/字段中的任何一个都不应该重命名。

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

更新

让我在这里澄清一下,我的 spring mvc 出于某种原因(我是 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>

【问题讨论】:

  • 在下面查看我的答案和解决方法,ProGuard 不支持此特定配置

标签: java spring maven obfuscation proguard


【解决方案1】:

ProGuard 过滤器对文件名起作用,所以

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

可能不会匹配任何类文件。你可能想要

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

ProGuard manual > Usage > File Filters

【讨论】:

  • 啊,是的,在他之前的问题(开始是另一个问题)中没有注意到这一点。
  • 如何将 proguard 指向我的爆炸战争而不是战争文件?即/target/myapp/WEB-INF/classes/
  • 我很困惑,是不是希望meta-inf/maven/ 有我的类文件夹?还是在检查包裹?
  • 好的,我没有得到:未能执行目标 ...proguard .. 无法重命名 /Users/me/dev/git/project1/myapp/target/myapp/web-inf/类(有关我在 pom.xml 中更改的内容,请参阅我的更新部分)
  • "Can't rename ..." 必须是来自 Maven 或来自 Maven 的 pyx4me ProGuard 插件的消息,而不是来自 ProGuard 本身的消息;所以我真的不知道。如果 ProGuard 工作正常,您应该会看到一些控制台消息“正在读取程序 ....,正在准备输出 ....,正在复制资源 ....”。 ProGuard 只能处理与输入目录不同的输出目录。也许插件在移动结果时遇到问题。
【解决方案2】:

你能发布你的整个 pom 吗?

通常,Maven 编译到 /target/classes(即使是 WAR 文件),并且 WAR 插件会在打包阶段之前复制到 web-inf/classes。您应该使用 Maven 手动将类编译到 web-inf/lib。

编辑:好的,这需要进行大量研究,但我已经为您找到了答案。首先,according to the ProGuard documentation,你的战争项目中不应该有 ANY 类:

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

您需要重构您的项目,以便将 Web 类构建在单独的 jar 中。一旦你构建了那个 jar 项目,你必须将它作为一个依赖添加到你的 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 配置,我想这不是必需的。

【讨论】:

  • 有了注释,他必须 -keepattributes,因为 proguard 默认会剥离它们。
  • 好的,我试试这个,谢谢你的帮助。我尝试按照您建议的 b4 将 proguard 指向目标/类,但这没有用,同样的错误说不能重命名文件夹。
  • 好吧,赏金已过期 :( 我希望这个答案仍然可以解决您的问题。请务必接受它是否有效,或者如果您需要任何帮助来设置其他 maven 项目!
  • @Blankman,如果这对您有用,我将不胜感激接受和/或投票。我花了几个小时为你研究这个。如果它不起作用,请告诉我。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-21
  • 2012-09-16
  • 2014-06-23
  • 1970-01-01
  • 2012-09-28
  • 2012-10-13
  • 2011-10-21
相关资源
最近更新 更多