Proguard говорит, что не может найти никаких классов - PullRequest
7 голосов
/ 13 января 2012

Я использую 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, ....

Кроме того, какие варианты вы предлагаете мне использовать? Это пружинный MVC, поэтому у меня есть аннотации, такие как:

  1. @ Autowired
  2. @ Service
  3. @ Repository
  4. @ Controller

Так что ни один из этих классов / полей не должен быть переименован, я бы подумал.

(Моя цель просточтобы это стало головной болью для тех, кто декомпилирует, так что они не могут просто декомпилировать и использовать код. Запутывание позволит им использовать его, но они не смогут поддерживать кодовую базу, если они не переписывают его.У меня нет причудливых алгоритмов, поэтому мне нечего скрывать.)

Обновление

Позвольте мне бытьясно, что мой весенний mvc по какой-то причине использует maven (я новичок в maven), когда чистая установка mvn создает как файл 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

Я получаю это сейчас:

ОК, я не получаю: не удалосьвыполнить цель ... 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 ]

5 голосов
/ 16 января 2012

Фильтры ProGuard работают с именами файлов, поэтому

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

, вероятно, не будет соответствовать ни одному файлу класса. Вы, вероятно, хотите

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

См. Руководство по ProGuard> Использование> Фильтры файлов

1 голос
/ 17 января 2012

Можете ли вы опубликовать весь свой пом?

Обычно Maven компилируется в / target / classes (даже для файлов WAR), а плагин WAR выполняет копирование в web-inf / classes прямо перед фазой пакета. Вы должны не вручную компилировать классы в web-inf / lib с Maven.

РЕДАКТИРОВАТЬ: ОК, это заняло немало исследований, но я нашел ответ для вас. Во-первых, согласно документации ProGuard , в вашем военном проекте не должно быть классов ANY :

В частности, файлы классов, которые находятся в каталоге WEB-INF / classes в Войну нужно упаковать в jar и поместить в каталог WEB-INF / lib

Вам необходимо провести рефакторинг вашего проекта, чтобы ваши веб-классы были собраны в отдельную флягу. Создав этот jar-проект, вы должны добавить его в качестве зависимости в ваш военный проект.

После того, как я создал эту настройку, мне удалось построить военный проект со следующей конфигурацией:

<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 собирался изменить имя моих классов, мне пришлось «сохранить» это имя сервлета, чтобы я мог ссылаться на него в файле WAR проекта web.xml. Если вы используете настройку сервлетов на основе аннотаций, я думаю, что в этом нет необходимости.

...