Подтвердить что ты не робот

Maven создает плоскую застежку-молнию

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

Если я поменяю упаковку в своем 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>, чтобы избавиться от бесполезной банки, которая иначе создана в target dir

Моя основная проблема заключается в том, что файлы, которые я упаковываю в 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?

4b9b3361

Ответ 1

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

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

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

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

Конфигурация анти-плагина:

  <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>