Maven перезаписывает файл ресурсов в зависимости - PullRequest
8 голосов
/ 11 ноября 2011

У меня есть два модуля Maven, A и B.A является зависимостью B.Оба модуля имеют файл ресурсов с именем default.properties, расположенный в src/main/resources.Мне нужно, чтобы имена файлов были одинаковыми, а расположение файла одинаковым в обоих проектах, потому что и A, и B используют код, который ожидает, что файл будет назван и расположен там, где он находится.При сборке B свойства A по умолчанию находятся в финале jar.Я хочу иметь свойства B при сборке B.Как я могу это сделать?

Ответы [ 2 ]

6 голосов
/ 04 июля 2014

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

Пример дескриптора maven-сборки на основе jar-with-зависимости (исправляет переопределение log4j.properties зависимостями):

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
    <id>jar-with-dependencies</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <useProjectArtifact>false</useProjectArtifact>
            <unpack>true</unpack>
            <unpackOptions>
                <excludes>
                    <exclude>log4j.properties</exclude>
                </excludes>
            </unpackOptions>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
    <fileSets>
        <fileSet>
            <directory>${project.build.outputDirectory}</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>

Ключом является предоставление различных правил для зависимостей и реального проекта (верхняя часть иерархии). Их можно разделить, используя <useProjectArtifact>false</useProjectArtifact> и предоставив отдельные правила в fileSets для проекта. В противном случае ни один из log4j.properties не будет упакован, включая верхний.

6 голосов
/ 11 ноября 2011

Хорошо, плагин Maven Resources и плагин Assembly не обрезали его, поэтому я выкопал еще немного.

Кажется, это возможно с плагином Maven Shade .

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <!-- Main class -->
                                <mainClass> <!-- fully qualified package and class name --> </mainClass>
                                <manifestEntries>
                                    <Class-Path>.</Class-Path>
                                </manifestEntries>
                            </transformer>
                        </transformers>

                        <filters>
                            <filter>
                                <artifact>org.something:SomeDependency</artifact>
                                <excludes>
                                    <exclude>*.properties</exclude>
                                </excludes>
                            </filter>
                        </filters>

                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Итак, внутри тегов <configuration> ... </configuration> я определил две вещи: реализацию-трансформера, которая заботится о том, чтобы модифицировать jar-манифест для запуска и использовать текущий каталог в качестве корневого пути к классу, и исключая все файлы, заканчивающиесяс .properties из зависимости org.something: SomeDependency.

Фактическая часть фильтрации - это то место, где вы можете исключить файлы, которые вы не хотите помещать в финальную банку, созданную затенением.Вы можете исключить файлы из всех зависимостей и текущего проекта, используя <artifact>*:*</artifact> внутри определенного <filter>, или вы можете выбрать только определенную зависимость, используя <artifact>dependcyGroupId:dependencyArtifact</artifact>, например <artifact>junit:junit</artifact>, или даже использовать подстановочные знаки для одной илидругое (<artifact>*:junit</artifact>).Затем исключенные файлы определяются внутри тегов <excludes>...</excludes>.Опять же, вы можете использовать точные имена файлов или подстановочные знаки.Это должно помочь вам решить вашу текущую проблему, хотя я бы посоветовал прочитать документацию с сайта плагина, потому что затенение может сделать намного больше, чем это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...