Как использовать обфускацию Proguard при создании пакета" maven-plugin"?

сгенерированная выходная банка проекта" maven-plugin " (используя maven-plugin-plugin) нарушается обфускацией, выполняемой должны быть. Попытка использовать запутанную банку в качестве плагина Maven создает исключения, такие как MojoExecutionException, которые завершают сборку с ошибкой. Каковы правильные параметры конфигурации Proguard, позволяющие генерировать рабочую банку "maven-plugin", содержащую автоматически сгенерированный дескриптор плагина?

1 ответов


основы плагинов Maven и инструмент Proguard

для создания плагина Maven (тип упаковки maven "maven-plugin", который генерирует банку, содержащую конкретные ресурсы конфигурации плагина), мы должны проинструктировать maven-plugin-plugin о местоположении и названии наших Mojos. Предполагая правильно настроенное выполнение maven-plugin-plugin, либо аннотации или другие параметры конфигурации, сгенерированный JAR будет содержать плагин.xml-файл в каталоге META-INF в корне JAR. Данный плагин.xml-файл описывает цели и настраиваемые параметры вашего плагина, используя статические ссылки на имена классов и пакетов Java (вы можете найти более подробную информацию об этом файле здесь).

особое внимание должно быть уделено включению обфускации в сборку банки" maven-plugin"; здесь мы объясняем шаги, предпринятые при использовании программы ProGuard запутывания библиотека. При использовании конфигурация Proguard по умолчанию для обфускации библиотеки, сгенерированный JAR больше не будет работать правильно, потому что Proguard переименовывает, сжимает, перемещает и запутывает важные файлы для плагина Maven. Попытка использовать ваш плагин, скорее всего, приведет к исключению, которое завершает сборку с ошибкой, связанной с невозможностью Maven runtime найти и обработать файлы конфигурации и класса плагина.

С маленькой реконфигурация тем не менее, мы можем поручить Proguard правильно поддерживать сгенерированные файлы плагинов и структуру каталогов вашей банки "maven-plugin". Необходимые изменения параметров Proguard заключаются в следующем:


Пользовательская Конфигурация Proguard

Структура Каталогов

-keepdirectories

это инструктирует Proguard поддерживать входную структуру каталогов JAR вместо перемещения всех файлов в корневой каталог. Maven ожидает плагин.xml-файл должен быть расположен в каталоге /META-INF/maven/, который сохраняется вместе со всеми другими каталогами с помощью этой опции. Вы можете фильтровать сохраненные каталоги более конкретно, указывая фильтр каталогов, однако я решил без разбора поддерживать все входные структуры каталогов.

Статические Ссылки На Пакеты

-keeppackagenamesorg.apache.maven.plugin.my.MyMojo

замените его пакет с пакетом, содержащим ваши определения Mojo. Если ваши определения Mojo не имеют общего пакета, вы должны указать каждый уникальный пакет, используя несколько параметров по мере необходимости. Если вы не уверены, какие пакеты необходимо сохранить, откройте созданный плагин.xml-файл в текстовом редакторе и изучить элементы " реализация "в каждом определении" mojo". Элемент "реализация" указывает класс с помощью полного имени. Каждый компонент пакета этих полных имен классов являются ли пакеты, которые вы должны указать. Например, мой basedir-плагин содержит значение элемента реализации Mojo " com.на GitHub.эмабри.знаток.подключаемый модуль.basedir.RootDirectoryGoal", поэтому я бы написал опцию как -keeppackagenames com.github.emabrey.maven.plugins.basedir.

Статические Ссылки На Класс

-keepnamesclass * implements org.apache.maven.plugin.AbstractMojo

этот параметр запрещает Proguard переименовывать классы, содержащие реализацию Mojo плагина Maven. Если эти классы были переименованы в вышеупомянутые элементы "реализации" больше не будут правильно идентифицировать классы, содержащие реализацию Mojo.

поля и методы частного класса

-keepclassmembersclass * implements org.apache.maven.plugin.AbstractMojo { private <fields>; private <methods>; }

эта опция запрещает Proguard переименовывать методы и поля уровня класса в реализации плагина Mojo. Maven использует имена этих полей/методов класса для создания элементов конфигурации для плагина. Если Proguard переименует поле среда выполнения Maven не сможет правильно заполнить реализацию Mojo пользовательской конфигурацией.


Завершена Настройка Proguard

полная конфигурация для версии 2.0.13 (больше версий здесь), включая конфигурацию библиотеки по умолчанию наряду с упомянутыми изменениями, предоставляется здесь для вашего удобства (не забудьте указать ${tool.proguard.version} собственность с последний версия артефакта proguard-base и замените пакет-заполнитель " org.Апачи.Мэйвен.плагин.мой.MyMojo " с соответствующим значением (- АМИ)):

<!-- Configures Proguard obfuscation tool to generate an
     obfuscated version of the JAR file that replaces the
     default unobfuscated JAR.
-->
<plugin>
    <groupId>com.github.wvengen</groupId>
    <artifactId>proguard-maven-plugin</artifactId>
    <version>2.0.13</version>
    <executions>
        <execution>
            <id>obfuscation-packaging</id>
            <phase>package</phase>
            <goals>
                <goal>proguard</goal>
            </goals>
            <configuration>
                <proguardVersion>${tool.proguard.version}</proguardVersion>
                <obfuscate>true</obfuscate>
                <attach>true</attach>
                <appendClassifier>false</appendClassifier>
                <addMavenDescriptor>true</addMavenDescriptor>
                <injar>${project.build.finalName}.jar</injar>
                <injarNotExistsSkip>true</injarNotExistsSkip>
                <libs>
                    <lib>${java.home}/lib/rt.jar</lib>
                </libs>

                <options>
                    <option>-keepdirectories</option>
                    <option>-keeppackagenames org.apache.maven.plugin.my.MyMojo</option>
                    <option>-keepnames class * implements org.apache.maven.plugin.AbstractMojo</option>
                    <option>-keepclassmembers class * implements org.apache.maven.plugin.AbstractMojo {
                        private <![CDATA[<fields>]]>;
                        private <![CDATA[<methods>]]>;
                    }
                    </option>
                    <option>-keepparameternames</option>
                    <option>-renamesourcefileattribute SourceFile</option>
                    <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
                        SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
                    </option>
                    <option>-target 1.8</option>
                    <option>-keep public class * {
                        public protected *;
                        }
                    </option>
                    <option>-keepclassmembernames class * {
                        java.lang.Class class$(java.lang.String);
                        java.lang.Class class$(java.lang.String, boolean);
                        }
                    </option>
                    <option>-keepclasseswithmembernames,includedescriptorclasses class * {
                        native <![CDATA[<methods>]]>;
                        }
                    </option>
                    <option>-keepclassmembers,allowoptimization enum * {
                        public static **[] values();
                        public static ** valueOf(java.lang.String);
                        }
                    </option>
                    <option>-keepclassmembers class * implements java.io.Serializable {
                        static final long serialVersionUID;
                        private static final java.io.ObjectStreamField[] serialPersistentFields;
                        private void writeObject(java.io.ObjectOutputStream);
                        private void readObject(java.io.ObjectInputStream);
                        java.lang.Object writeReplace();
                        java.lang.Object readResolve();
                        }
                    </option>
                </options>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>net.sf.proguard</groupId>
            <artifactId>proguard-base</artifactId>
            <version>${tool.proguard.version}</version>
        </dependency>
    </dependencies>
</plugin>