Плагин maven shade автоматически переводит имена пакетов в Windows? - PullRequest
0 голосов
/ 05 июля 2018

У меня есть два локальных артефакта: один с com.org.abc, другой с COM.org.xyz. Я создал затененную банку, включая эти 2 и все другие необходимые зависимости.

Когда я создаю затененную банку на Linux, создаются 2 отдельные папки: com и COM. НО НА ОКНАХ СОЗДАЕТСЯ ТОЛЬКО ОДИНОЧНАЯ ПАПКА.

Когда я создаю затененную банку в Windows, она создает одну папку: com.org с папками abc и xyz внутри. Отдельная заглавная COM-папка не создается. Поэтому код, зависящий от пакета COM в верхнем регистре, завершается неудачно с ошибкой инициализации класса.

(я не назвал 2 выше, они были созданы и распределены по отдельности 2 отдельными командами, и многие команды использовали эти банки, поэтому изменение имени пакета - длинный цикл)

Конфигурация Maven:

<plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <version>2.5.2</version>
                <executions>
                    <execution>
                        <id>add-mylocal</id>
                        <phase>clean</phase>
                        <configuration>
                            <file>${jars.path}/mylocal.jar</file>
                            <repositoryLayout>default</repositoryLayout>
                            <groupId>com.org</groupId>
                            <artifactId>mylocal</artifactId>
                            <version>1.0</version>
                            <packaging>jar</packaging>
                            <generatePom>true</generatePom>
                            <localRepositoryPath>${local.repo.path}</localRepositoryPath> 
                        </configuration>
                        <goals>
                            <goal>install-file</goal>
                        </goals>
                    </execution>    
                </executions>
            </plugin>
            <plugin>                                
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.1.0</version>
                <executions>
                    <execution>                 
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <source>1.7</source>
                            <target>1.7</target>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                  <manifestEntries>
                                    <Build-Version>${buildversion} (${timestamp})</Build-Version>
                                  </manifestEntries>
                                </transformer>
                            </transformers>
                        </configuration>                                                                        
                    </execution>                                        
                </executions>
            </plugin>
        </plugins>

Есть ли какое-нибудь решение, чтобы оно работало на Windows?

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Хотя кажется, что maven shade удаляет каталог COM верхнего регистра, он фактически объединяет его с каталогом нижнего регистра.

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

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

<relocations>
    <relocation>
        <pattern>COM.org.xyz</pattern>
        <shadedPattern>com.org.xyz</shadedPattern>
    </relocation>
</relocations>

Ваша окончательная конфигурация будет выглядеть так:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                      <manifestEntries>
                        <Build-Version>${buildversion} (${timestamp})</Build-Version>
                      </manifestEntries>
                    </transformer>
                </transformers>
                <relocations>
                    <relocation>
                        <pattern>ME.ferrybig.uppercase.com</pattern>
                        <shadedPattern>me.ferrybig.uppercase.com</shadedPattern>
                    </relocation>
                </relocations>
            </configuration>
        </execution>
    </executions>
</plugin>
0 голосов
/ 06 июля 2018

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

Коротко:

В Windows плагин Shade объединял папки COM с com , потому что Windows обрабатывает их без учета регистра, поэтому, если пакет com уже создан, это только добавит содержимое COM вместо создания нового.

Решение:

В моем плагине shade я создал 2 jar-файла uber - один содержит COM-пакеты в верхнем регистре, а второй - со всеми другими зависимостями. Это решило проблему, потому что не было конфликта с com в первом банке, поскольку он содержал только COM .

Конфигурация, которую я использовал, была взята из этого поста.

В основном в первом блоке выполнения я включил артефакты, содержащие COM-пакеты, и исключил их из второго блока выполнения:

Блок исполнения 1:

<include><artifact_name_with_COM_package></include> 

Блок исполнения 2:

<exclude><artifact_name_with_COM_package></exclude> 

ПРИМЕЧАНИЕ: Еще раз, первый выбор должен заключаться в обеспечении соблюдения стандартов именования в пакетах. Но если вам нужен быстрый обходной путь, вы можете попробовать это.

0 голосов
/ 05 июля 2018

Документирование обсуждения из комментариев в качестве ответа для потомков:

Проблема здесь не в maven-shade-plugin, который не изменяет (или даже не заботится) случай пакета. Проблема здесь в том, что базовая файловая система [windows] нечувствительна к регистру и не различает com и COM.

Если вы не захотите изменить имена пакетов, в maven-shade-plugin нет обходного пути. Вам придется использовать файловую систему с учетом регистра. Однажды привлекательным вариантом будет использование Windows Subsystem для Linux , которая предоставляет свою собственную чувствительную к регистру файловую систему (ext4, IIRC).

Существует также способ сделать регистр файловой системы NTFS чувствительным к регистру (см., Например, этот поток SU ), но я никогда сам этого не делал и не могу рекомендовать его исходя из личного опыта.

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