2016-07-02 3 views
0

Я хочу построить проект Maven с зависимостями вне .jar, но каждая зависимость должна быть в отдельном каталоге, как:Как создать банку с Maven, который включает в себя зависимости в отдельную папку для каждой зависимости

libs/${dependency.groupId}/${dependency.artifactId}/${dependency.version} 

Так же, как это:

/build 
    my.jar 
    /libs 
    /org.yaml 
     /snakeyaml 
     /1.17 
      snakeyaml-1.17.jar 
    /etc... 

Я знаю, что есть maven-dependency-plugin, но, как настроить его, как это? Или есть какой-нибудь другой плагин, который может это сделать?

+1

'my.jar' не будет исполняемым JAR, так как он не будет содержать классы зависимостей. Похоже, вы хотите создать сборку, как пользовательский ZIP? – Tunaki

+0

@Tunaki ему не нужно содержать классы зависимостей, в реальном проекте тоже будет запускаться, что получит все библиотеки и запустит этот .jar с допустимым пулом классов. Я отредактирую название. – GotoFinal

+1

Хорошо, но я думаю, вам нужно упаковать те, которые находятся в конечном контейнере, например, ZIP или TAR? – Tunaki

ответ

3

Что вы действительно хотите сделать здесь, это создать собственный архив для вашего проекта. Для этого вы хотите использовать maven-assembly-plugin.

Есть несколько аспектов, чтобы рассмотреть следующие вопросы:

  • Вы хотите базовый каталог build. Это задается параметром <baseDirectory>.
  • Вы хотите иметь все зависимости проекта в репозитории, подобной каталогу. Для этого вы можете использовать таможню outputFileNameMapping для dependencySet. Это позволяет использовать a set of properties; в этом случае нас интересует идентификатор группы, идентификатор артефакта и версия. Нам нужно отключить <useProjectArtifact>, иначе он также включит главный артефакт проекта.
  • Для основного артефакта мы просто используем элемент <file>, указывая на главный артефакт проекта.

Дескриптор сборки будет выглядеть следующим образом:

<assembly 
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> 
    <id>bin</id> 
    <formats> 
     <format>dir</format> <!-- to turn into final archive type --> 
    </formats> 
    <baseDirectory>build</baseDirectory> 
    <files> 
     <file> 
      <source>${project.build.directory}/${project.build.finalName}.${project.packaging}</source> 
     </file> 
    </files> 
    <dependencySets> 
     <dependencySet> 
      <outputDirectory>libs</outputDirectory> 
      <outputFileNameMapping>${artifact.groupId}/${artifact.artifactId}/${artifact.version}/${artifact.artifactId}-${artifact.version}${dashClassifier?}.${artifact.extension}</outputFileNameMapping> 
      <useProjectArtifact>false</useProjectArtifact> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

Обратите внимание, что она использует <format> из dir, что означает, что он не «пакет» выходной структуры внутри архива, но оставляет ее структуру каталогов , В будущем вы сможете настроить этот дескриптор сборки с помощью сценариев запуска и сделать окончательный архив, изменив этот формат на тот, который вам нужен.

Наконец, конфигурация плагина сам будет

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.6</version> 
    <executions> 
     <execution> 
      <id>make-assembly</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      <configuration> 
       <appendAssemblyId>false</appendAssemblyId> 
       <descriptors> 
        <descriptor>src/main/assembly/assembly.xml</descriptor> <!-- path to the above assembly descriptor --> 
       </descriptors> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

При такой конфигурации, запуске mvn clean install выхода будут разыскиваемой структура каталогов внутри target/${finalName}.

+0

Я не могу понять, как использовать это в многомодульном проекте с родительскими помпами, я продолжаю получать 'Не удалось создать сборку: Ошибка добавления файла в архив: B: \ path \ artifact-1.0.pom', добавив его в список исключений, похоже, ничего не меняет. – GotoFinal

+0

ОК, я думаю, что я получил это, но мне нужно было создать дополнительный проект, который будет выполнен последним и использовать этот плагин в нем. Так спасибо;) – GotoFinal

+0

один вопрос, если вы все еще здесь, есть какой-то способ переместить этот 'baseDirectory' за пределы каталога' artifact/target'? – GotoFinal

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