有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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,因此我有如下注释:

  1. @自动连线
  2. @服务
  3. @存储库
  4. @控制器

因此,我认为这些类/字段中的任何一个都不应该重命名

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

更新

让我在这里澄清一下,我的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>

共 (2) 个答案

  1. # 1 楼答案

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

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

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

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

    ProGuard manual > Usage > File Filters

  2. # 2 楼答案

    你能把你所有的pom都发出去吗

    通常,Maven编译到/target/classes(甚至对于WAR文件),WAR插件在打包阶段之前复制到web inf/classes。您应该而不是使用Maven手动将类编译为web inf/lib

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

    Notably, class files that are in the WEB-INF/classes directory in a war should be packaged in a jar and put in the WEB-INF/lib directory

    您需要重构项目,以便将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”。由于Progord将更改我的类的名称,我必须“保留”这个servlet名称,以便在WAR项目的web中引用它。xml。如果使用基于注释的servlet配置,我想这是不必要的