2015-06-04 2 views
4

Как использовать тень maven или плагин сборки, чтобы автоматически определять, какие классы необходимы из банок зависимости, и копировать ТОЛЬКО эти классы в сборку. До сих пор мне не повезло, что он автоматически обнаружил, какие классы будут необходимы для моей сборки.Упаковка ТОЛЬКО необходимые классы из зависимостей

я могу использовать minimizeJar и включать и исключать теги указать, какие классы добавляются, но то, что я действительно хочу, чтобы это сделать, это что-то так:

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

Я думаю о проблеме все неправильно? Как я могу заставить maven автоматически минимизировать размер банки в зависимости от того, какой импорт используется? (пожалуйста, не просто скажите этот плагин maven), потому что я уже нахожусь в тупике, мне нужен пример того, что добавить моему моменту, чтобы выполнить эти задачи.

+0

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

ответ

0

ProGuard может удалить неиспользованные классы и даже больше.

ProGuard - это бесплатный кусочек файла Java, оптимизатор, обфускатор и преверизатор. Он обнаруживает и удаляет неиспользуемые классы, поля, методы и атрибуты. Он оптимизирует байт-код и удаляет неиспользуемые инструкции. Он переименовывает остальные классы, поля и методы, используя короткие бессмысленные имена.

Во-первых, вы должны упаковать банку с зависимостями. Это можно легко сделать с помощью Maven-сборки-плагина:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.5.4</version> 
    <configuration> 
     <archive> 
      <manifest> 
       <mainClass>com.test.HelloWorld</mainClass> 
      </manifest> 
     </archive> 
     <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
    </configuration> 
    <executions> 
     <execution> 
      <id>make-assembly</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Затем настройте ProGuard для оптимизации генерируемой баночки. Для Maven проектов используйте proguard-maven-plugin:

<plugin> 
    <groupId>com.github.wvengen</groupId> 
    <artifactId>proguard-maven-plugin</artifactId> 
    <version>2.0.10</version> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals><goal>proguard</goal></goals> 
     </execution> 
    </executions> 
    <configuration>   
     <injar>${project.build.finalName}-jar-with-dependencies.jar</injar> 
     <outjar>${project.build.finalName}-small.jar</outjar> 
     <outputDirectory>${project.build.directory}</outputDirectory> 
     <options> 
      <option>-dontobfuscate</option> 
      <option>-dontwarn com.google.**</option> 
      <option>-keep public class com.test.HelloWorld {public static void main(java.lang.String[]);}</option> 
     </options> 
     <libs> 
      <lib>${java.home}/lib/rt.jar</lib> 
     </libs> 
    </configuration> 
</plugin> 

После этих шагов запустить

mvn clean install 

и проверить target/<artifact name>-small.jar - он должен содержать только классы, которые фактически используются во время выполнения.

Обратите внимание, что могут возникнуть проблемы, если ваш код или ваши зависимости используют отражение.

 Смежные вопросы

  • Нет связанных вопросов^_^