Geotools使用Java的Service基础结构来加载负责EPSG查找的类。原始的
gt-epsg-hsql.jar条目中
/meta-INF/services/指定了jar文件实现哪些接口,以及哪些接口可以在运行时动态加载。
构建uber-jar时,将多个jar文件合并为一个。最有可能的是,另一个jar文件也实现了相同的接口(例如
gt-referencing.jar),因此文件中具有相同的名称
/meta-INF/services/。当将所有内容放入一个jar文件时,这些条目很可能会被覆盖(至少我找不到maven-shade-
plugin合并此类服务文件的任何引用)。
您可以通过查看创建的uber-jar中的services-directory来验证这一点,尤其是在entry处
/meta-INF/services/org.opengis.referencing.crs.CRSAuthorityFactory。双方
gt-epsg-hsql.jar并
gt-referencing.jar有(从GeoTools可能也和其他jar文件)这样的文件,以及最有可能的,只有一个的内容会在你的尤伯杯罐子,导致所有其他类没有被发现/在运行时加载。
我对maven-shade-plugin并不是很熟悉,但是关于SO的其他问题(例如[1])建议使用其他转换器:
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
编辑: 由于此答案会定期访问,并且我现在已经熟悉了阴影插件,因此这里是使用阴影插件的更详细的指南。
因此,我们可以使用maven-shade插件来创建一个多合一的jar,而不是使用maven-assembly插件。为此,请在室内配置maven-
shade插件
pom.xml并将其绑定到包阶段(因此,每当您调用时
mvn package,都会创建阴影罐子:
<build> <plugins> <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> <transformers> <!-- This bit sets the main class for the executable jar as you otherwise --> <!-- would with the assembly plugin --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> <Main-Class>com.example.YourMainClass</Main-Class> <Implementation-Vendor>Your Company Name</Implementation-Vendor> <Implementation-Version>${project.version}</Implementation-Version> </manifestEntries> </transformer> <!-- This bit merges the various GeoTools meta-INF/services files --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> </configuration> </execution> </executions> </plugin> </plugins></build>并不一定在所有情况下都需要使用
Implementation-Vendor和
Implementation-Version,但是我观察到以下情况:缺少此信息时,某些代码(我认为是JAI-
Java高级映像)会抱怨并且行为不当,这可能是因为原始JAR包含了此类信息,而阴影部分并未默认值,因此最好将其包括在内。
运行时
mvn package,它将原始jar文件重命名为
original-myArtifact.jar,并将阴影(= all-in-one,fat-
jar,uber-
jar)放在
myArtifact.jar。如果您不喜欢这种行为,并且想要保持原始的jar文件完整并保留阴影的jar文件,请在代码
configuration块中添加以下行:
<shadedArtifactAttached>true</shadedArtifactAttached>
在这种情况下,构建过程将创建一个文件
myArtifact-shaded.jar(类似于
myArtifact-jar-with-dependencies.jar程序集插件创建的文件)。



