Maven создает плоскую сборку на молнии - PullRequest
20 голосов
/ 01 октября 2009

Для Maven гуру там: Я пытаюсь упаковать не-Java-артефакты проекта (.NET) в один zip-файл. У меня 2 проблемы:

Если я поменяю упаковку в моем POM на zip <packaging>zip</packaging>, я получу это сообщение об ошибке: [INFO] Cannot find lifecycle mapping for packaging: 'zip'. Component descriptor cannot be found in the component repository: org.apache.mav en.lifecycle.mapping.LifecycleMappingzip. ОК, ничего страшного - я изменил его на <packaging>pom</packaging>, чтобы избавиться от ненужной банки, которая в противном случае создается в целевой каталог

Моя главная проблема в том, что файлы, которые я упаковываю в ZIP, вложены в несколько каталогов, но мне нужно поместить их в верхний каталог ZIP. Вот мой сборочный файл:

 <assembly>
  <id>bin</id>
  <formats>
    <format>zip</format>
  </formats>
  <fileSets>
    <fileSet>
      <directory>${basedir}/${project.artifactId}</directory>
      <includes>
        <include>**/Bin/Release/*.dll</include>
        <include>**/Bin/Release/*.pdb</include>
      </includes>
    </fileSet>
  </fileSets>
</assembly>

Когда я запускаю это - я получаю ZIP-файл, но файлы будут вложены, начиная с C: \, за которым следует полный путь. Чтобы дать вам идею - проект сбрасывает свои двоичные файлы в следующую структуру ProjectFoo\ProjectFoo\subproject1\Bin\Release\foo.dll и мне нужно ZIP\foo.dll

Вот конфигурация сборочного плагина:

<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
    <descriptors>
        <descriptor>assembly.xml</descriptor>
    </descriptors>
</configuration>
<executions>
    <execution>
        <id>zip</id>
        <phase>package</phase>
        <goals>
            <goal>single</goal>
        </goals>
    </execution>
</executions>

Может быть, мне просто нужно использовать antrun и выполнить задачу ant zip?

1 Ответ

28 голосов
/ 01 октября 2009

Как вы уже видели, здесь нет упаковки на молнии, поэтому имеет смысл использовать упаковку pom по вашему выбору.

Вы столкнулись с некоторой дырой в обработке плагина сборки. Вы можете решить эту проблему, указав несколько наборов файлов в сборке с помощью <outputDirectory>/<outputDirectory>, по одному для каждого каталога, который вы хотите включить, это, очевидно, PITA и, вероятно, не приемлемое решение.

Альтернативный подход - использовать задачу копирования Ant, чтобы скопировать все библиотеки DLL в промежуточный каталог, а затем включить этот каталог в сборку.

Следующая конфигурация должна делать то, что вам нужно:

Конфигурация antrun-plugin:

  <plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.3</version>
    <executions>
      <execution>
        <phase>process-resources</phase>
        <configuration>
          <tasks>
            <copy todir="${project.build.directory}/dll-staging">
              <fileset dir="${basedir}/${project.artifactId}">
                <include name="**/Bin/Release/*.dll"/>
                <include name="**/Bin/Release/*.pdb"/>
              </fileset>
              <flattenmapper/>
            </copy>
          </tasks>
        </configuration>
        <goals>
          <goal>run</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Сборка:

 <assembly>
  <id>bin</id>
  <formats>
    <format>zip</format>
  </formats>
  <fileSets>
    <fileSet>
      <directory>${project.build.directory}/dll-staging</directory>
      <outputDirectory>/</outputDirectory>
      <includes>
        <include>*.dll</include>
        <include>*.pdb</include>
      </includes>
    </fileSet>
  </fileSets>
</assembly>
...