Можно ли переименовать maven jar-with-dependencies?

138

В настоящее время я использую сборку jar-with-dependencies для создания такого jar. Однако название моей банки немного длинное.

Поскольку этот jar-файл используется RPG-программами на AS400, я хотел бы сократить его, чтобы облегчить жизнь этим разработчикам. Но, кроме как вручную, я не нашел способа переименовать банку из обычной project-name-version-classifier-jar-with-dependencies.jar. Я хотел бы что-то вродеproject-name-version-classifier-full.jar

Есть ли способ сделать это, не копируя дескриптор сборки jar-with-dependencies и не вызывая его полностью?

Кроме того, я хочу продолжать хранить банку без собранного пути к классам в хранилище.

Мне нужны два артефакта. Баночка с моим классификатором, содержащая регион, для которого предназначена сборка. Баночка со всеми зависимостями, в которую входит также регион.

project-name-version-region-full.jarи project-name-version-region.jarдолжны храниться в хранилище. В первом примере классификатор заполнен по регионам, во втором - по регионам. Последний работает.

Майк Корнелл
источник

Ответы:

227

Вы можете указать свойство finalName, чтобы дать jar желаемое имя, и указать, что appendAssemblyId должен иметь значение false, чтобы избежать суффикса «jar-with-dependencies».

Приведенная ниже конфигурация выведет jar с именем «test.jar»

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.2-beta-4</version>
  <executions>
    <execution>
      <id>jar-with-dependencies</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <finalName>test</finalName>
        <appendAssemblyId>false</appendAssemblyId>
      </configuration>
    </execution>
  </executions>
</plugin>

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

В качестве обходного пути вы можете скопировать дескриптор сборки, используемый дескриптором jar-with-dependencies, и изменить идентификатор.

Этот пример приведет к добавлению идентификатора сборки к finalName, поэтому, если вам нужно иметь имя region-full.jar , вы можете указать finalName как регион и идентификатор сборки как полный . Это приведет к созданию файла в target с именем region-full.jar, но обратите внимание, что он все равно будет установлен в репозиторий Maven в качестве вложенного артефакта, а full используется в качестве классификатора. Пока этот идентификатор отличается от идентификатора вашей другой сборки, столкновения не должно быть.

Конфигурация пом будет выглядеть следующим образом.

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.2-beta-4</version>
  <executions>
    <execution>
      <id>jar-with-dependencies</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptors>
          <descriptor>src/main/assembly/jar-assembly.xml</descriptor>
        </descriptors>
        <finalName>region</finalName>
      </configuration>
    </execution>
  </executions>
</plugin>

и jar-assembly.xml в src / main / assembly, например так:

<assembly>
  <id>full</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <unpack>true</unpack>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <directory>${project.build.outputDirectory}</directory>
    </fileSet>
  </fileSets>
</assembly>
Богатый продавец
источник
Работаю над этой разработкой Рич. По сути, мне нужно хранить два артефакта классификатора. С включенным appendAssemblyId у меня было 3 артефакта, один без классификатора, версия классификатора и версия jar-with-dependencies. с отключенным appendAssemblyID установлен uber jar для версии без классификатора. Мне нужно, чтобы эти парни использовали классификатор на основе региона +, который говорит, где они были построены. К сожалению, добавление тега классификатора не работает.
Майк Корнелл
36

Я думаю, что я нашел способ настроить это непосредственно в pom, не нуждаясь в отдельном jar-assembly.xml.

Это в основном то же самое, что и ответ Рича, за исключением того, что finalName указывается с помощью artifactId и version.

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <finalName>${project.artifactId}-${project.version}-full</finalName>
        <appendAssemblyId>false</appendAssemblyId>
        <archive>
            <manifest>
                <mainClass>com.mycompany.MyMainClass</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-my-jar-with-dependenciess</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>
vikingsteve
источник
8

Благодаря сообщениям здесь и некоторому копанию в документации maven я придумал следующую конфигурацию для общей одноразовой перепакованной исполняемой сборки jar с произвольным именем.

В pom.xml:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution>
            <id>exe</id>
            <phase>package</phase>
            <goals><goal>single</goal></goals>
            <configuration>
                <finalName>MyJarName</finalName>
                <attach>false</attach>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptors>
                    <descriptor>assembly.xml</descriptor>
                </descriptors>
                <archive>
                    <manifest>
                        <mainClass>karlthepagain.MyMain</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </execution>
    </executions>
</plugin>

В Assembly.xml:

<assembly>
    <id>exe</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <unpack>true</unpack>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
</assembly>

Это произведет MyJarName.jarсо всеми его зависимостями, повторно упакованными в тот же самый jar и указанный Main-Class: karlthepagain.MyMain.

Карл Язычник
источник
3

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

Мой файл jar-assembly.xml выглядел примерно так, что позволило изменить идентификатор сборки для региона, который был сохранен как свойство в моем профиле:

<assembly>
  <id>${env}-full</id>
    <formats>
      <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
      <dependencySet>
        <unpack>true</unpack>
        <scope>runtime</scope>
      </dependencySet>
    </dependencySets>
    <fileSets>
      <fileSet>
        <directory>${project.build.outputDirectory}</directory>
      </fileSet>
    </fileSets>
</assembly>

Я не использовал параметр finalName в настройках плагина maven-assembly-plugin, так как это создало мой проект с моим именем project-name-version-env-full.jar, где env-full был классификатором.

Вообразите мое удивление, когда я узнал, что сборка xml может быть параметризована элементами в сборке. Это было именно то, что я искал.

Майк Корнелл
источник
2

Это сработало для меня

<build>
    <finalName>anynameyoulike</finalName>
    <plugins>           
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>                   
                <appendAssemblyId>false</appendAssemblyId>
                <archive>
                    <manifest>
                        <mainClass>com.mycompany.MyMainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id> <!-- this is used for inheritance merges -->
                    <phase>package</phase> <!-- bind to the packaging phase -->
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
umesh9883
источник
1

Также возможно перезаписать исходный файл JAR, используя в ${project.build.finalName}качестве окончательного имени:

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
   <executions>
      <execution>
          <phase>package</phase>
          <goals>
             <goal>single</goal>
          </goals>
      </execution>
   </executions>
   <configuration>
     <descriptorRefs>
       <descriptorRef>jar-with-dependencies</descriptorRef>
     </descriptorRefs>
     <finalName>${project.build.finalName}</finalName>
     <appendAssemblyId>false</appendAssemblyId>
   </configuration>
 </plugin>
Марк Шефер
источник