Вручную прикрепите основной артефакт, если он построен Maven-assembly-plugin

у меня возникли проблемы с созданием проекта maven. У меня есть требование произвести детерминированные JAR-файлы, которые должны быть двоичными в разных сборках и версиях, если между этими сборками нет изменений исходного кода. Для этой цели я использовал в этой статье для руководства.

мне успешно удалось построить мои банки, и они соответствуют моим требованиям. Вот мой конфигурация:

  <plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.7</version>
    <executions>
      <execution>
        <id>step-1-remove-timestamp</id>
        <phase>prepare-package</phase>
        <configuration>
          <target>
            <touch datetime="01/01/2015 00:10:00 am">
              <fileset dir="target/classes"/>
              <fileset dir="src"/>
            </touch>
          </target>
        </configuration>
        <goals>
          <goal>run</goal>
        </goals>
      </execution>
      <execution>
        <id>step-3-rename-assembly</id>
        <phase>package</phase>
        <configuration>
          <target>
            <copy file="${project.build.directory}/${project.build.finalName}-deterministic.zip"
                  tofile="${project.build.directory}/${project.build.finalName}.jar"/>
          </target>
        </configuration>
        <goals>
          <goal>run</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

  <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2.1</version>
    <configuration>
      <descriptors>
        <descriptor>src/main/assembly/zip.xml</descriptor>
      </descriptors>
    </configuration>
    <executions>
      <execution>
        <id>step-2-make-assembly</id>
        <phase>prepare-package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

в приведенном выше коде я создаю и упаковываю банку как zip, а затем копирую zip поверх ожидаемого артефакта jar.
Проблема с вышеизложенным заключается в том, что maven все еще выполняет maven-jar-plugin, поэтому собранная вручную банка перезаписывается одним из maven-jar-plugin. Я не хочу использовать эту банку, так как это не соответствует моим требованиям.

Итак, я отключил maven-jar-plugin выполнение, явно установив его для запуска для недопустимой фазы, как ниже: (видел, что из другие посты здесь)

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.5</version>
    <executions>
      <execution>
        <id>default-jar</id>
        <phase>never</phase>
        <configuration>
          <finalName>unwanted</finalName>
          <classifier>unwanted</classifier>
        </configuration>
      </execution>
    </executions>
  </plugin>

все кажется прекрасным, пока я не обнаружил, что мой главный артефакт jar никогда не устанавливается в . Для этого я также добавил maven-helper-plugin так что я вручную прикрепляю любые артефакты, которые я создаю из плагина ассемблера:

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.9.1</version>
    <executions>
      <execution>
        <id>attach-instrumented-jar</id>
        <phase>verify</phase>
        <goals>
          <goal>attach-artifact</goal>
        </goals>
        <configuration>
          <artifacts>
            <artifact>
              <file>${project.build.directory}/${project.build.finalName}.jar</file>
              <type>jar</type>
            </artifact>
          </artifacts>
        </configuration>
      </execution>
    </executions>
  </plugin>

это приводит к ошибке, я не могу решить:

[ошибка] не удалось выполнить цель орг.codehaus.mojo: build-helper-maven-plugin:1.9.1:прикрепить-артефакт (прикрепить-инструментальный-jar) в проекте my-project: выполнение прикрепить-инструментальный-jar цели org.codehaus.mojo:build-helper-maven-plugin:1.9.1: attach-artifact failed: for artifact {полное имя моего проекта.jar}:присоединенный артефакт должен иметь другой идентификатор, чем соответствующий основной артефакт. - > [Help 1]

есть ли способ преодолеть эту проблему? Я проверил решения, и большинство рекомендуем использовать классификаторы, но я хочу установить основной артефакт так же, как и maven-jar-plugin. Другое программное обеспечение, которое мы разрабатываем, потребует стандартной зависимости jar, и мы хотим избежать усложнения нашей настройки, необоснованно вводя классификаторы.

1 ответов


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

Итак, ошибка, которую я получил

присоединенный артефакт должен иметь другой идентификатор, чем соответствующий основной артефакт.

значит для меня, что я не могу вручную установить снова "" главная экспонат. Поскольку этот артефакт больше не производится maven-jar-plugin, Он никогда не будет запланирован для установки, даже если файл присутствует (задача копирования antrun создает банку с тем же именем).

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

  1. повторно включить maven-jar-plugin как должно быть:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>2.5</version>
      <executions>
        <execution>
          <id>default-jar</id>
          <phase>package</phase>
        </execution>
      </executions>
    </plugin>
    

    это произведет стандартный опарник на package фаза, и самое главное, делает maven осведомленным для он будет установлен во время install этап.

  2. настройки maven-antrun-plugin копировать задачи перезаписать уже произведенная банка с детерминированной молнией. Настройка почти идентична, как в моем вопросе, поэтому я только добавляю различия:

    <plugin>
      <artifactId>maven-antrun-plugin</artifactId>
      <version>1.7</version>
      <executions>
        <execution>...</execution>
        <execution>
          <id>step-3-rename-assembly-and-sources</id>
          <phase>package</phase>
          <configuration>
            <target>
              <copy file="${project.build.directory}/${project.build.finalName}-deterministic.zip"
                    tofile="${project.build.directory}/${project.build.finalName}.jar"
                    overwrite="true"/>
            </target>
          </configuration>
        </execution>
          . . .
      </executions>
    </plugin>
    

    операция копирования теперь имеет overwrite="true" указано. Первоначально операция копирования, казалось, игнорировала файлы в месте назначения, если они уже существуют, и произошло то, что maven-jar-plugin было уже создан артефакт jar по умолчанию при копировании. С помощью этого параметра,maven-antrun-plugin теперь переопределяет первую банку детерминированной, а последняя становится предметом maven install этап.

  3. удалена настройка из build-helper-maven-plugin, так что основной артефакт jar не копируется во второй раз:


            <artifact>
              <file>${project.build.directory}/${project.build.finalName}.jar</file>
              <type>jar</type>
            </artifact>

вот и все, правильная банка установлена в .m2 реж.