Java maven shade插件是否会在Windows上自动关闭软件包名称?

Java maven shade插件是否会在Windows上自动关闭软件包名称?,java,linux,windows,maven,case-sensitive,Java,Linux,Windows,Maven,Case Sensitive,我有两个本地工件:一个是com.org.abc,另一个是com.org.xyz。我已经创建了一个着色的jar,包括这2个和所有其他需要的依赖项 在LINUX上创建着色JAR时,会创建两个单独的文件夹:com和com。但在WINDOWS上只创建一个文件夹。 当我在windows上创建一个着色jar时,它会创建一个文件夹:com.org,其中包含文件夹abc和xyz。未创建单独的大写COM文件夹。因此,依赖大写COM包的代码失败,出现无法初始化类错误 (我没有给上面的2个命名,它们是由2个独立的团队

我有两个本地工件:一个是
com.org.abc
,另一个是
com.org.xyz
。我已经创建了一个着色的jar,包括这2个和所有其他需要的依赖项

在LINUX上创建着色JAR时,会创建两个单独的文件夹:com和com。但在WINDOWS上只创建一个文件夹。

当我在windows上创建一个着色jar时,它会创建一个文件夹:com.org,其中包含文件夹abc和xyz。未创建单独的大写COM文件夹。因此,依赖大写COM包的代码失败,出现无法初始化类错误

(我没有给上面的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>

org.apache.maven.plugins
maven安装插件
2.5.2
添加mylocal
清洁的
${jars.path}/mylocal.jar
违约
com.org
mylocal
1
罐子
真的
${local.repo.path}
安装文件
org.apache.maven.plugins
maven阴影插件
3.1.0
包裹
阴凉处
1.7
1.7
${buildversion}(${timestamp})

有什么解决方案可以在windows上运行吗?

将评论中的讨论记录下来,作为对后代的回答:

这里的问题不是maven shade插件,它不修改(甚至不关心)包的大小写。这里的问题是底层[windows]文件系统不区分大小写,并且不区分
com
com

除非您愿意更改包名,否则maven shade插件中没有解决方法。您必须使用区分大小写的文件系统。曾经吸引人的选择是使用,它提供了自己的区分大小写的文件系统(ext4,IIRC)


还有一种方法可以使NTFS文件系统区分大小写(例如,请参阅),但我本人从未这样做过,根据个人经验,我不能推荐它。

虽然maven shade实际上似乎删除了大写COM目录,但它实际上将其与小写COM目录合并

这种区别似乎很小,但允许我们使用maven shade的一个特殊部分来解决这个问题,即重新定位功能

使用此功能,我们可以将命名奇怪的大写字母库重新定位为小写字母,而无需对这些库的源代码进行任何更改


COM.org.xyz
com.org.xyz
最终的阴影配置如下所示:


org.apache.maven.plugins
maven阴影插件
3.1.0
包裹
阴凉处
1.7
1.7
${buildversion}(${timestamp})
ME.ferrybig.uppercase.com
me.ferrybig.uppercase.com

我找到了上述问题的解决方案。尽管最佳实践,正如Ferrybig和Mureinik在他们的回答中所建议的那样,是对项目强制执行小写的包名标准,但由于在我的情况下这是不可能的,我遵循了以下方法

问题简而言之:

在Windows上,shade插件正在将COM文件夹与COM合并,因为Windows将它们视为不区分大小写的,因此如果已经创建了一个包COM,它将只在其中添加COM的内容,而不是创建新的内容

解决方案:

在我的shade插件中,我创建了两个uber JAR——一个包含大写COM包,另一个包含所有其他依赖项。这解决了这个问题,因为第一个jar中的com没有冲突,因为它只包含com

我使用的配置来自

基本上,在第一个执行块中,我包括了包含COM包的工件,并将其从第二个执行块中排除:

执行块1:

<include><artifact_name_with_COM_package></include> 

执行块2:

<exclude><artifact_name_with_COM_package></exclude> 


注意:同样,第一选择应该是在包中强制实施命名标准。但是,如果您想快速解决问题,可以尝试一下。

您是否使用不区分大小写的文件系统(例如,windows上的任何文件系统)?maven shade插件不应该关心case@Mureinik. 你是对的。我经营同一家公司