Включая распакованную войну в сборе
У меня есть проект, который строит войну (без проблем). И эта война должна быть упакована с несколькими сценариями оболочки. Поскольку эта война содержит файлы свойств, которые варьируются от сайта к сайту, мы не можем просто установить войну, как есть, но изменить файлы свойств в ней. Это то, что делают сценарии оболочки.
Я хотел бы упаковать мою войну в мою сборку как распакованную войну. я вижу <unpacked>
в дескрипторе сборки, но я не смог заставить это работать.
Вот мой первый bin.xml
где я просто упаковал войну как есть. Это отлично работает:
<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>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.basedir}/src/assembly/scripts</directory>
<includes>
<include>deploy.sh</include>
<include>lock_build.sh</include>
<include>description.sh</include>
<include>url-encode.pl</include>
</includes>
<outputDirectory>/</outputDirectory>
</fileSet>
<fileSet>
<directory>${project.build.directory}/${project.artifactId}-${project.version}</directory>
<outputDirectory>${project.artifactId}</outputDirectory>
</fileSet>
</fileSets>
</assembly>
Вот моя первая попытка без упаковки:
<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>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.basedir}/src/assembly/scripts</directory>
<includes>
<include>deploy.sh</include>
<include>lock_build.sh</include>
<include>description.sh</include>
<include>url-encode.pl</include>
</includes>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
<moduleSets>
<moduleSet>
<includes>
<include>{$project.groupId}:${project.artifactId}:war</include>
</includes>
<binaries>
<includes>
<include>${project.build.directory}-${project.artifactId}-${project.version}.${project.packaging}</include>
</includes>
<outputDirectory>${project.artifactId}</outputDirectory>
<unpack>true</unpack>
</binaries>
</moduleSet>
</moduleSets>
</assembly>
Вот моя последняя попытка получить распакованную войну:
<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>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.basedir}/src/assembly/scripts</directory>
<includes>
<include>deploy.sh</include>
<include>lock_build.sh</include>
<include>description.sh</include>
<include>url-encode.pl</include>
</includes>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
<moduleSets>
<moduleSet>
<binaries>
<attachmentClassifier>war</attachmentClassifier>
<outputDirectory>${project.artifactId}</outputDirectory>
<unpack>true</unpack>
<includeDependencies>true</includeDependencies>
<dependencySets>
<dependencySet/>
</dependencySets>
</binaries>
</moduleSet>
</moduleSets>
</assembly>
В каждой из этих двух последних попыток я только упаковываю сценарии, и война не заканчивается.
Я знаю, что мог бы использовать ${project.build.directory}/${project.artifactId}-${project.version}
каталог, который содержит почти все файлы в войне, но он не содержит мой MANIFEST.MF
записи, которые включают в себя информацию, связывающую войну с конкретной версией Дженкинса и ревизией Subversion.
Что мне нужно сделать, чтобы включить в мою сборку распакованную войну?
Еще одна попытка
<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>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.basedir}/src/assembly/scripts</directory>
<includes>
<include>deploy.sh</include>
<include>lock_build.sh</include>
<include>description.sh</include>
<include>url-encode.pl</include>
</includes>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>${project.artifactId}</outputDirectory>
<unpack>true</unpack>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>
Когда я запустил это, я получил:
[INFO] ------------------------------------------------------------------------
[INFO] Building My Project 1.0.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-assembly-plugin:2.5.2:single (default-cli) @ myproj ---
[INFO] Reading assembly descriptor: src/assembly/bin.xml
[WARNING] Cannot include project artifact: \
com.vegicorp:myproj:war:1.0.0; \
it doesn't have an associated file or directory.
[INFO] Building zip: ~/workdir/trunk/myproj/target/archive/myproj.zip
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
Внутри почтового индекса находятся все банки войны, красивые и без упаковки, но не моя без упаковки война.
1 ответ
Я знаю, что смогу добавить распакованную войну в мою сборку. я вижу это unpack
вариант, и я знаю, что это работает для других зависимостей. Тем не менее, похоже, что я могу получить к нему доступ только через <dependencySet>
или <moduleSet>
, Я должен иметь возможность указать свой проект в качестве собственного модуля. Должно быть, я что-то не так делаю.
Селезенка Вент
Это большая вещь, которую я ненавижу в Maven: Maven делает большую работу, скрывая от вас вещи, что приятно, потому что это мешает вам делать то, что вы не должны. Я ненавижу, когда разработчики строят Ant build.xml
файлы, потому что большинство разработчиков не понимают, как сделать сборку, и build.xml
становится нечитаемым беспорядком. С Maven это не проблема. Просто настройте свой проект, и Maven позаботится об этом за вас.
Но иногда Maven похож на черный ящик с кучей рычагов и кнопок. Вы сидите и нажимаете на рычаги и кнопки, пытаясь понять, как заставить его делать то, что вы хотите. Я трачу слишком много времени, пытаясь помочь разработчикам настроить свои проекты Maven. Они хотят сделать что-то немного другое, например использовать hibernate или создать исходный код из файлов WSDL, и не знают, как заставить Maven делать то, что они хотят.
Один разработчик описывает его как автомобиль с самостоятельным вождением, который не может ехать туда, куда вы хотите. Вы можете даже увидеть пункт назначения в окне, но вы не можете понять, как управлять пунктом назначения автомобиля, чтобы доставить вас туда.
То, что я хочу сделать, должно быть легко. Я просто хочу создать сборку, и вместо использования упакованного файла войны, я хочу, чтобы он был распакован.
В Ant это можно сделать с помощью одной задачи. В Maven это загадочный процесс. Я думаю, что я близок, возможно, мне не хватает одного маленького параметра конфигурации, который заставит все это работать, но я уже потратил часы, работая над этим.
Что я в итоге делал
Я использовал плагин maven-dependency-plugin, чтобы распаковать мою войну. Я не был уверен, сработает ли это, потому что я не хотел, чтобы плагин зависимости загружал войну, но, похоже, он понимает, что когда я указываю свою войну, я говорю о текущей сборке, и ничего не загружается. (У меня даже нет войны в нашем репо Maven).
Мне также пришлось обновить Maven с 2.x до 3.x, потому что мне нужно убедиться, что maven-dependency-plugin
побежал до maven-assembly-plugin
, Поскольку оба запускаются на этапе компоновки сборки, Maven 2.x не может гарантировать порядок запуска плагинов.
Как только я использовал этот плагин, все, что мне нужно было сделать, это указать каталог, в который я распаковал войну, в моем сборочном плагине, и он был включен в мой zip.
Я все еще хочу знать, как использовать <unpack>
сущность в самом плагине сборки вместо того, чтобы использовать другой плагин для распаковки моей войны. Если кто-нибудь может сказать мне, как сделать распаковку в самом файле сборки, я отмечу это как правильный ответ.
pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.9</version>
<executions>
<execution>
<id>unpack</id>
<phase>package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/unwar/${project.artifactId}</outputDirectory>
<artifactItems>
<artifactItem>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<type>war</type>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.2</version>
<configuration>
<finalName>${project.artifactId}</finalName>
<appendAssemblyId>false</appendAssemblyId>
<outputDirectory>${project.build.directory}/archive</outputDirectory>
<descriptors>
<descriptor>src/assembly/bin.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
bin.xml (Моя сборка)
<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>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.basedir}/src/assembly/scripts</directory>
<fileMode>0755</fileMode>
<lineEnding>lf</lineEnding>
<includes>
<include>deploy.sh</include>
<include>lock_build.sh</include>
<include>description.sh</include>
<include>url-encode.pl</include>
</includes>
<outputDirectory>/</outputDirectory>
</fileSet>
<fileSet>
<directory>${project.build.directory}/unwar</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
</assembly>
АКТУАЛЬНЫЙ Ответ
Благодаря ссылке на khmarbaise (см. Комментарий ниже) я скопировал плагин сборки этого проекта, и он почти сработал. Как и моя попытка, он распаковал все фляги времени выполнения, а не только тот, который я хотел. Однако, это также распаковало мою войну.
Было только два различия между ответом этой ссылки и моей попыткой:
- Они включены
<useProjectArtifact>true</useProjectArtifact>
а я нет Тем не менее, это по умолчаниюtrue
, Удаление все же позволило ему работать. - Они включали
/
перед именем каталога в<outputDirectory>
, Удаление этого не имело никакого значения.
Это означало, что теперь это соответствует тому, что я ранее пробовал. Итак, почему это работает на этот раз.
Оказывается, я тестировал изменения в сборке, просто запустив mvn assembly:single
, В конце концов, зачем делать всю сборку и переупаковку, когда я просто пытаюсь заставить сборку работать. Когда ты бежишь просто mvn assembly:single
- даже если все уже упаковано, вы получаете эту ошибку:
[WARNING] Cannot include project artifact: \
com.vegicorp:myproj:war:1.0.0; \
it doesn't have an associated file or directory.
И ваша война не распакована. Однако, если вы поместите сборку в фазу пакета, а затем запустите mvn package
все работает просто отлично.
Затем я потратил время, пытаясь получить мою войну, а не все связанные с ней вещи во время выполнения. я использовал <includes/>
чтобы сделать это, но потому что у меня есть война, а не банку, я должен был включить классификатор в моем <include>
,
Наконец-то у меня все работает. У меня есть это в моей сборке:
<dependencySets>
<dependencySet>
<outputDirectory>${project.artifactId}</outputDirectory>
<unpack>true</unpack>
<scope>runtime</scope>
<includes>
<include>${project.groupId}:${project.artifactId}:*:${project.version}</include>
</includes>
</dependencySet>
</dependencySets>
И пока я бегу mvn package
, оно работает.
Это намного лучше, чем то, что я имел с maven-dependency-plugin
, Теперь вся информация, касающаяся сборки, находится в файле XML сборки.