Включая распакованную войну в сборе

У меня есть проект, который строит войну (без проблем). И эта война должна быть упакована с несколькими сценариями оболочки. Поскольку эта война содержит файлы свойств, которые варьируются от сайта к сайту, мы не можем просто установить войну, как есть, но изменить файлы свойств в ней. Это то, что делают сценарии оболочки.

Я хотел бы упаковать мою войну в мою сборку как распакованную войну. я вижу <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 сборки.

Другие вопросы по тегам