Можно ли переименовать maven jar-with-dependencies? - PullRequest
117 голосов
/ 26 августа 2009

В настоящее время я использую сборку 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 должны храниться в хранилище. В первом примере классификатор заполнен по регионам, во втором - по регионам. Последний работает.

Ответы [ 5 ]

205 голосов
/ 26 августа 2009

Можно указать свойство finalName , чтобы присвоить банку желаемое имя, и указать, что appendAssemblyId должно быть ложным, чтобы избежать суффикса "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 как region и идентификатор сборки как full . Это приведет к созданию файла в target с именем region-full.jar, но обратите внимание, что он все равно будет установлен в репозиторий Maven как прикрепленный артефакт с full , используемым в качестве классификатора. Пока этот идентификатор отличается от идентификатора вашей другой сборки, столкновения не должно быть.

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

<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>
26 голосов
/ 19 января 2013

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

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

<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>
8 голосов
/ 08 марта 2011

Благодаря сообщениям здесь и некоторому копанию в maven docs Я придумал следующую конфигурацию для общей одноразовой перепакованной исполняемой сборки 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>

В сборке.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 голосов
/ 26 августа 2009

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

Мой файл 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, так как это построило мой проект с моим именем project-name-version-env-full.jar, где env-full был классификатор.

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

2 голосов
/ 21 июля 2016

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

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