代码之家  ›  专栏  ›  技术社区  ›  tryingToLearn

maven shade plugin会自动在windows上降低包名吗?

  •  1
  • tryingToLearn  · 技术社区  · 6 年前

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

    当我在Linux上创建阴影jar时,会创建2个单独的文件夹:COM和COM。但是在windows上只创建一个文件夹。

    当我在windows上创建一个着色jar时,它会创建一个文件夹:com.org,其中包含abc和xyz文件夹。未创建单独的大写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>
    

    有什么办法可以让它在windows上运行吗?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Mureinik    6 年前

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

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

    除非您愿意更改包名称,否则maven shade插件中没有解决方法。你必须使用区分大小写的文件系统。一旦有吸引力的选择将是使用 Windows Subsystem for Linux ,它提供了自己的区分大小写的文件系统(ext4,iirc)。

    还有一种方法可以使ntfs文件系统区分大小写(例如, this SU thread ),但我自己从来没有这样做过,也不能根据个人经验推荐。

        2
  •  1
  •   Ferrybig    6 年前

    虽然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>
    
        3
  •  0
  •   tryingToLearn    6 年前

    我找到了解决上述问题的办法。尽管最佳实践,正如ferrybig和mureinik在他们的答案中所建议的,是对项目强制使用小写的包名称标准,但是由于在我的例子中这是不可能的,所以我遵循了以下方法。

    简而言之:

    在windows上,shade插件正在合并 组件对象模型 文件夹 通用域名格式 ,因为Windows将它们视为不区分大小写,所以如果 通用域名格式 已经创建,它将添加 组件对象模型 而不是创造一个新的。

    解决方案:

    在我的shade插件中,我创建了两个uber jar——一个包含大写的com包,另一个包含所有其他依赖项。这解决了问题,因为 通用域名格式 在第一个罐子里 组件对象模型 是的。

    我使用的配置来自 this post.

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

    执行块1:

    <include><artifact_name_with_COM_package></include> 
    

    执行块2:

    <exclude><artifact_name_with_COM_package></exclude> 
    

    注: 同样,第一个选择应该是在包中实施命名标准。但如果你想快速解决问题,你可以试试这个。