Невозможно отключить создание пустого JAR (maven-jar-plugin)

Иногда мои компоненты Talend Open Studio имеют ресурсы, но не источники Java (это чисто компоненты метаданных). В таком случае мне нужно отключить создание файлов JAR.

Я настроил maven-jar-plugin следующим образом:

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
        <configuration>
            <forceCreation>false</forceCreation>
            <skipIfEmpty>true</skipIfEmpty>
            <useDefaultManifestFile>false</useDefaultManifestFile>
        </configuration>
      </plugin>

но я все еще получаю файл ${project.name}.jar с pom.properties, pom.cml, манифестом и пустым файлом App.class, содержащим только "класс {}"

Хотя я могу отключить включение всех материалов maven, используя это:

<archive>
<addMavenDescriptor>false</addMavenDescriptor>
</archive>

Я все еще получаю JAR с файлом манифеста внутри него.

Есть ли какие-то параметры конфигурации, которые я неправильно настроил?


person Gabriele B    schedule 04.11.2012    source источник
comment
Измените тип упаковки на что-то отличное от jar, но, основываясь на фрагменте вашего pom, я не уверен, что это сработает.   -  person khmarbaise    schedule 04.11.2012
comment
Я думаю, что это не очень хорошая идея, поскольку для тех компонентов, у которых есть каталог src, должен быть упакован стандартный файл JAR.   -  person Gabriele B    schedule 04.11.2012


Ответы (3)


Самый эффективный способ отключить создание банок — настроить maven-jar-plugin следующим образом:

<plugins>
    <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.3.1</version>
        <executions>
            <execution>
                <id>default-jar</id>
                <phase>none</phase>
            </execution>
        </executions>
    </plugin>
</plugins>

Он поместит создание jar по умолчанию в фазу none, он никогда не будет запущен.

person maba    schedule 06.11.2012
comment
Это, безусловно, самый элегантный способ сделать это. Но мне нужно условно отключить создание jar (т.е. только если /src/main/java не существует) - person Gabriele B; 07.11.2012
comment
Если вы выполните установку mvn, произойдет сбой с ошибкой Не удалось выполнить цель org.apache.maven.plugins:maven-install-plugin:2.5.2:install (установка по умолчанию) в проекте xxx: упаковка для этого проекта не назначить файл артефакту сборки - person tok; 14.02.2019
comment
Это исправило это для меня: <plugin> <artifactId>maven-jar-plugin</artifactId> <executions> <execution> <id>default-jar</id> <phase>none</phase> </execution> </executions> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <executions> <execution> <id>default-install</id> <phase>none</phase> </execution> </executions> </plugin> - person tok; 14.02.2019

Я нашел решение сам, даже если это всего лишь обходной путь. Я удаляю JAR, используя задачу удаления antrun, если каталог /src/main/java не существует:

<!-- remove the empty JAR if not needed -->
<if>
    <not><available file="${basedir}/src/main/java" type="dir" /></not>
    <then>
    <delete file="${project.build.directory}/${project.name}-${project.version}.jar"/>
    </then>
</if>

эта задача требует, чтобы antcontrib работал должным образом, и, конечно же, она не работает, если вы планируете делать выпуски с помощью maven (но это нормально для компонентов только с метаданными, таких как плагины Talend Open Studio)

person Gabriele B    schedule 04.11.2012
comment
Я предполагаю, что это не удастся, если вы будете выпускать релизы через Maven. - person khmarbaise; 04.11.2012
comment
да, но выпуск компонента Talend - это всего лишь копия некоторых файлов в целевой папке. - person Gabriele B; 04.11.2012
comment
ИМХО, лучше использовать artifactId, а не name : <delete file="${project.build.directory}/${project.artifactId}-${project.version}.jar"/> - person Petr Kozelka; 07.11.2012
comment
или, еще лучше, просто finalName : <delete file="${project.build.directory}/${project.build.finalName}.jar"/>‌ - да, это правильно, см. maven.apache.org/plugins/maven-jar-plugin/ - person Petr Kozelka; 07.11.2012

Вы можете указать maven-jar-plugin не создавать файлы META-INF/maven/*/pom., как описано в Справочник по архиватору Maven.

Кроме того, вы можете использовать параметр skipIfEmpty.

Следующий код объединяет оба эти (просто чтобы они были готовы к копированию и вставке):

...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <skipIfEmpty>true</skipIfEmpty>
                <archive>
                    <addMavenDescriptor>false</addMavenDescriptor>
                </archive>
...

Это отлично работает, но когда вы делаете mvn install, происходит сбой из-за отсутствия артефакта проекта. Аналогичная проблема, вероятно, будет с mvn deploy и с релизом, но я не проверял.

Однако, если вы можете жить с удалением antrun, свойство skipIfEmpty, вероятно, подойдет вам и будет немного более элегантным. По крайней мере, он не вводит новое исполнение и его зависимости и т. д.

person Petr Kozelka    schedule 06.11.2012
comment
tnx Петр за ваш ответ, но я заметил, что с вашей конфигурацией (на самом деле, я использовал ее) файл JAR все еще генерируется, только с файлом манифеста - person Gabriele B; 07.11.2012
comment
странно - вы не забыли применить свойство skipIfEmpty? потому что в моем тестировании pom это действительно заставляет mvn clean package перестать его создавать. Или вы забыли clean ? (Без обид - это просто воспроизводимо работает на моей машине, так что я не могу поверить :) ) - person Petr Kozelka; 07.11.2012
comment
На 100% уверен :) может быть, это потому, что у меня есть (хотя и пустой) каталог ресурсов? - person Gabriele B; 07.11.2012