трансформер для плагина Maven Shade для работы с Java-отражением - PullRequest
2 голосов
/ 24 января 2012

Плагин тени Maven игнорирует имена классов / пакетов в строках, что типично для отражения Java.Если библиотека, которую вы пытаетесь «затенить», использует Class.forName («originalpackagename ....»), заштрихованная зависимость не будет работать, поскольку исходное имя пакета останется без изменений.та же история с кодом типа

servlet.addServletWithMapping("org.mortbay.jetty.servlet.DefaultServlet",
    URIUtil.SLASH);

и, что еще хуже:

private String[] _serverClasses = {
    "-org.mortbay.jetty.plus.annotation.",       // don't hide
    "-org.mortbay.jetty.plus.jaas.",             // don't hide 
    "-org.mortbay.jetty.plus.naming.",           // don't hide
    "-org.mortbay.jetty.plus.jaas.",             // don't hide
    "-org.mortbay.jetty.servlet.DefaultServlet", // don't hide
    "org.mortbay.jetty.", 
    "org.slf4j."
}; 

(примеры скопированы из исходного кода сервера Jetty)

возможно, уже есть какой-то ResourceTransformerдоступно для Maven Shade, который заменяет исходные имена пакетов / классов в исходном коде строк? ..

1 Ответ

0 голосов
/ 06 мая 2015

Скорее всего, это новое поведение, поскольку, когда вы задали свой вопрос (я использую версию 2.3), плагин shade, по-видимому, автоматически обрабатывает литералы имен пакетов в исходных файлах Java.

Однако для файлов ресурсов это не так. Например, если вы попытаетесь заштриховать пакеты log4j, а затем сослаться на класс реализации logger из log4j.properties, у вас будет исключение во время выполнения. Я не вижу ничего специально для плагина Shade, но я исправил эту проблему с помощью стороннего maven-replacer-plugin. Например:

<plugin>
  <groupId>com.google.code.maven-replacer-plugin</groupId>
  <artifactId>replacer</artifactId>
  <version>1.5.3</version>
  <executions>
    <execution>
      <phase>prepare-package</phase>
      <goals>
        <goal>replace</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <basedir>${project.build.directory}</basedir>
    <includes>
      <include>classes/*.properties</include>
    </includes>
    <replacements>
      <replacement>
        <token>org.</token>
        <value>my-shaded-package-root.org.</value>
      </replacement>
    </replacements>
  </configuration>
</plugin>
...