В Maven как исключить ресурсы из сгенерированной банки?

Когда я создаю исполняемую банку с зависимостями (используя данное руководство), все файлы свойств также упаковываются в эту банку. Как остановить это? Спасибо.

UPDATE: я попытался исключить их, используя плагин ресурсов Maven, но тогда мое приложение не найдет файлы свойств при запуске он в Eclipse (щелкните правой кнопкой мыши по модулю → Запустить как → Java-приложение)

ОБНОВЛЕНИЕ: Спасибо за полезные ответы. Я думаю, мне лучше потратить время на изучение Maven, так как сейчас я просто выбираю самое простое решение.

Ответы

Ответ 1

Поместите эти файлы свойств в src/test/resources. Файлы в src/test/resources доступны в Eclipse автоматически через eclipse:eclipse, но не будут включены в пакетный JAR by Maven.

Ответ 2

Чтобы исключить любой файл из каталога jar/target, вы можете использовать тег <excludes> в файле pom.xml.

В следующем примере все файлы с расширением .properties не будут включены:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>*.properties</exclude>
            </excludes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

Ответ 3

По соглашению, каталог src/main/resources содержит ресурсы, которые будут использоваться приложением. Таким образом, Maven будет включать их в окончательный JAR.

Таким образом, в вашем приложении вы будете обращаться к ним с помощью метода getResourceAsStream(), поскольку ресурсы загружаются в путь к классам.

Если вам нужно иметь их вне приложения, не храните их в src/main/resources, поскольку они будут связаны Maven. Конечно, вы можете исключить их (используя ссылку, заданную chkal), но лучше создать другой каталог (например, src/main/external-resources), чтобы сохранить соглашения относительно каталога src/main/resources.

В последнем случае вам придется доставлять ресурсы самостоятельно в качестве вашего JAR файла (этого можно добиться с помощью плагина Assembly). Если вам нужно получить к ним доступ в среде Eclipse, перейдите в Properties вашего проекта, а затем на вкладке Java Build Path в Sources добавьте папку (например, src/main/external-resources). Затем Eclipse добавит этот каталог в путь к классам.

Ответ 5

Это вызывает именно использование Maven JAR Plugin

Например, если вы хотите исключить все из src/test/resources/ из последней банки, поставьте это:

<build>

        <plugins>
            <!-- configure JAR build -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.3.1</version>
                <configuration>
                    <excludes>
                        <exclude>src/test/resources/**</exclude>
                    </excludes>
                </configuration>
            </plugin>

...

Файлы под src/test/resources/ будут по-прежнему доступны в классе-пути, они просто не будут в результате JAR.

Ответ 6

Когда я создаю исполняемую банку с зависимостями (используя это руководство), все файлы свойств также упаковываются в эту банку. Как остановить это? Спасибо.

Свойства файлов откуда? Ваша главная банка? Зависимости?

В первом случае размещение ресурсов под src/test/resources, как было предложено, вероятно, является самым прямым и простым вариантом.

В более позднем случае вам нужно создать собственный дескриптор сборки со специальным excludes/exclude в unpackOptions.

Ответ 7

Другая возможность - использовать Maven Shade Plugin, например. для исключения файла свойств ведения журнала, который используется только локально в вашей среде IDE:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>${maven-shade-plugin-version}</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <filters>
                    <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                            <exclude>log4j2.xml</exclude>
                        </excludes>
                    </filter>
                </filters>
            </configuration>
        </execution>
    </executions>
</plugin>

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