maven shade 插件是否会自动将 Windows 上的包名称小写?
Does maven shade plugin automatically downcase the package names on Windows?
我有两个本地工件:一个 com.org.abc
,另一个 COM.org.xyz
。我创建了一个阴影 jar,包括这 2 个和所有其他需要的依赖项。
当我在 LINUX 上创建一个 SHADED JAR 时,创建了 2 个单独的文件夹:com 和 COM。但是在 WINDOWS 上只创建了一个文件夹。
当我在 windows 上创建一个阴影 jar 时,它会创建一个文件夹:com.org,其中包含文件夹 abc 和 xyz。不会创建单独的大写 COM 文件夹。因此,依赖于大写 COM 包的代码失败,无法初始化 class 错误。
(我没有命名上面的 2 个,它们是由 2 个独立的团队分别创建和分发的,许多团队一直在使用这些 jar,所以更改包名是一个很长的周期)
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 上运行吗?
记录评论中的讨论作为后代的答案:
这里的问题不是maven-shade-plugin,它不修改(甚至不关心)包的大小写。这里的问题是底层 [windows] 文件系统不区分大小写,并且不区分 com
和 COM
.
除非您愿意更改包名称,否则在 maven-shade-plugin 中没有解决方法。您必须使用区分大小写的文件系统。曾经有吸引力的选择是使用 Windows Subsystem for Linux,它提供自己的区分大小写的文件系统(ext4、IIRC)。
还有一种方法可以使 NTFS 文件系统区分大小写(参见 this SU thread),但我自己从未这样做过,并且不能根据个人经验推荐它。
虽然 maven shade 实际上似乎删除了大写的 COM 目录,但它实际上将它与小写的合并。
这个区别看似很小,但是可以让我们使用maven shade的一个特殊部分来解决这个问题,即重定位功能。
使用此功能,我们可以将 奇怪地 命名为大写的库重新定位为小写,而不需要对这些库的源代码进行任何更改。
<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>
我找到了上述问题的解决方案。尽管最佳实践(正如 Ferrybig 和 Mureinik 在他们的回答中所建议的那样)是对项目强制执行小写包名称标准,但由于在我的情况下这是不可能的,所以我采用了以下方法。
问题简述:
在 Windows 上,阴影插件正在将 COM 文件夹与 com 合并,因为 Windows 将它们视为不区分大小写,所以如果包 com 已经创建,它只会在其中添加 COM 的内容,而不是创建新的。
解法:
在我的 shade 插件中,我创建了 2 个 uber jar - 一个包含大写 COM 包,第二个包含所有其他依赖项。这解决了这个问题,因为在第一个 jar 中没有与 com 冲突,因为它只包含 COM.
我使用的配置来自this post.
基本上在第一个执行块中,我包含了包含 COM 包的工件,并从第二个执行块中排除了相同的工件:
执行块1:
<include><artifact_name_with_COM_package></include>
执行块2:
<exclude><artifact_name_with_COM_package></exclude>
注意:再次重申,首选应该是在包中强制执行命名标准。但是如果你想要一个快速的解决方法,你可以试试这个。
我有两个本地工件:一个 com.org.abc
,另一个 COM.org.xyz
。我创建了一个阴影 jar,包括这 2 个和所有其他需要的依赖项。
当我在 LINUX 上创建一个 SHADED JAR 时,创建了 2 个单独的文件夹:com 和 COM。但是在 WINDOWS 上只创建了一个文件夹。
当我在 windows 上创建一个阴影 jar 时,它会创建一个文件夹:com.org,其中包含文件夹 abc 和 xyz。不会创建单独的大写 COM 文件夹。因此,依赖于大写 COM 包的代码失败,无法初始化 class 错误。
(我没有命名上面的 2 个,它们是由 2 个独立的团队分别创建和分发的,许多团队一直在使用这些 jar,所以更改包名是一个很长的周期)
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 上运行吗?
记录评论中的讨论作为后代的答案:
这里的问题不是maven-shade-plugin,它不修改(甚至不关心)包的大小写。这里的问题是底层 [windows] 文件系统不区分大小写,并且不区分 com
和 COM
.
除非您愿意更改包名称,否则在 maven-shade-plugin 中没有解决方法。您必须使用区分大小写的文件系统。曾经有吸引力的选择是使用 Windows Subsystem for Linux,它提供自己的区分大小写的文件系统(ext4、IIRC)。
还有一种方法可以使 NTFS 文件系统区分大小写(参见 this SU thread),但我自己从未这样做过,并且不能根据个人经验推荐它。
虽然 maven shade 实际上似乎删除了大写的 COM 目录,但它实际上将它与小写的合并。
这个区别看似很小,但是可以让我们使用maven shade的一个特殊部分来解决这个问题,即重定位功能。
使用此功能,我们可以将 奇怪地 命名为大写的库重新定位为小写,而不需要对这些库的源代码进行任何更改。
<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>
我找到了上述问题的解决方案。尽管最佳实践(正如 Ferrybig 和 Mureinik 在他们的回答中所建议的那样)是对项目强制执行小写包名称标准,但由于在我的情况下这是不可能的,所以我采用了以下方法。
问题简述:
在 Windows 上,阴影插件正在将 COM 文件夹与 com 合并,因为 Windows 将它们视为不区分大小写,所以如果包 com 已经创建,它只会在其中添加 COM 的内容,而不是创建新的。
解法:
在我的 shade 插件中,我创建了 2 个 uber jar - 一个包含大写 COM 包,第二个包含所有其他依赖项。这解决了这个问题,因为在第一个 jar 中没有与 com 冲突,因为它只包含 COM.
我使用的配置来自this post.
基本上在第一个执行块中,我包含了包含 COM 包的工件,并从第二个执行块中排除了相同的工件:
执行块1:
<include><artifact_name_with_COM_package></include>
执行块2:
<exclude><artifact_name_with_COM_package></exclude>
注意:再次重申,首选应该是在包中强制执行命名标准。但是如果你想要一个快速的解决方法,你可以试试这个。