2015-01-30 1 views
8

Нам нужно построить банку, используя Maven, таким образом, чтобы все ее зависимости были включены, но также и то, что все эти зависимости переименованы (перемещены).Maven - Есть ли способ создать «uber» банку со всеми перестановками зависимостей?

Скажу, наши собственные пакеты начинаются с com.mycompagny.projectx.*». Мы хотим, чтобы зависимости проекта, чтобы их пакет переименованы начинается с„embedded“, но не наши собственные классы.

Использование maven-shade-plugin, например, я не в состоянии достичь этого:.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.3</version> 
    <configuration> 
     <shadedArtifactAttached>true</shadedArtifactAttached> 
     <createDependencyReducedPom>true</createDependencyReducedPom> 
     <artifactSet> 
      <includes> 
       <include>*.*</include> 
      </includes> 
     </artifactSet> 
     <relocations> 
      <relocation> 
       <pattern>*</pattern> 
       <shadedPattern>embedded.</shadedPattern> 
       <excludes> 
        <exclude>com.mycompagny.projectx.*</exclude> 
       </excludes> 
      </relocation> 
     </relocations> 
    </configuration> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Здесь <pattern>*</pattern> не действует Кроме того, если я использую <pattern></pattern> (пустая строка), то все перемещается на «вложенной» пакет, даже к ресурсам (в «META -INF "di попечитель тоже)! Конечно, мы хотим, чтобы ресурсы оставались в корне банки.

Я думаю, мы могли бы создать несколько <relocation> элементов, по одному для каждого пакета зависимостей, но это было бы очень много работы: <relocation>com</relocation>, <relocation>net</relocation>, <relocation>javax</relocation> и т.д.

Любая идея о том, как легко менять место жительства все зависимостей внутри банки uber, не касаясь наших собственных классов, ресурсов и каталога «META-INF»?

ответ

6

ОБНОВЛЕНИЕ: Это решение действительно не работает, пожалуйста, прочитайте до конца.

Я нашел решение, посмотрев исходный код maven-shade-plugin! Это, кажется, не быть задокументированы в любом месте, но есть параметр <rawString>, что вы можете добавить в <relocation> элемент так consideres в <pattern> и <shadedPattern> в качестве шаблонов регулярных выражений, а не как имена пакетов/файлов.

maven-shade-plugin Затем код использует что-то вроде:

path.replaceAll(pattern, shadedPattern) 

Чтобы справиться с этими узорами.

Пример:

<relocation> 
    <pattern>^([^/]*\.properties)$</pattern> 
    <shadedPattern>embedded/$1</shadedPattern> 
    <rawString>true</rawString> 
</relocation> 

Это фиктивный пример, который перемещает все файлы .properties, которые находятся в корневом каталоге. Используя эту технику, можно будет точно контролировать, что перемещается и как, я уверен.

Вот лучший пример, который делает то, что мне нужно (еще несколько тестов, чтобы сделать хотя):

<relocation> 
    <pattern>^(?!(com/mycompagny/|META-INF))(.*/.*)$</pattern> 
    <shadedPattern>embedded/$2</shadedPattern> 
    <rawString>true</rawString> 
</relocation> 

UPDATE: К сожалению, эта последняя модель означает, что все использовали будет переименован, за исключением «ком. mycompagny "и папку META-INF. Проблема в том, что такие вещи, как java.lang.Object, будут переименованы! И когда код запускается, такие исключения будут выбрасываться:

java.lang.ClassNotFoundException: embedded.java.lang.Object 
+0

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

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