你在看你自己创建的罐子吗?还是第三方库?我已经为前者发布了一个轻量级的解决方案。因此,如果您在运行时查找的 jar 包在您自己手中,请继续尝试;-)。它可能比从 jar 文件中读取 XML 或属性要优雅一些。
想法
- 使用 Java 服务加载器 方法可以在以后添加尽可能多的组件/工件,它们可以在运行时贡献自己的版本。创建一个非常轻量级的库,只需几行代码即可读取、查找、过滤和排序类路径上的所有工件版本。
- 创建一个maven源代码生成器插件,在编译时为每个模块生成服务实现,在每个jar中打包一个非常简单的服务。
解决办法
解决方案的第一部分是artifact-version-service 库,现在可以在github 和MavenCentral 上找到它。它涵盖了服务定义和一些在运行时获取工件版本的方法。
第二部分是artifact-version-maven-plugin,也可以在github 和MavenCentral 上找到。它用于让生成器轻松实现每个工件的服务定义。
示例
获取所有带有坐标的模块
不再需要读取jar manifest,只需一个简单的方法调用:
// iterate list of artifact dependencies
for (Artifact artifact : ArtifactVersionCollector.collectArtifacts()) {
// print simple artifact string example
System.out.println("artifact = " + artifact);
}
返回一组排序的工件。要修改排序顺序,请提供自定义比较器:
new ArtifactVersionCollector(Comparator.comparing(Artifact::getVersion)).collect();
这样返回的工件列表按版本号排序。
查找特定的工件
ArtifactVersionCollector.findArtifact("foo.bar", "foobar");
获取特定工件的版本详细信息。
查找具有匹配 groupId(s) 的工件
查找所有 groupId foo.bar 的工件(完全匹配):
ArtifactVersionCollector.findArtifactsByGroupId("foo.bar", true);
查找 groupId 以 foo.bar 开头的所有工件:
ArtifactVersionCollector.findArtifactsByGroupId("foo.bar", false);
按版本号排序结果:
new ArtifactVersionCollector(Comparator.comparing(Artifact::getVersion)).artifactsByGroupId("foo.", false);
对工件列表实施自定义操作
通过提供 lambda,第一个示例可以这样实现:
ArtifactVersionCollector.iterateArtifacts(a -> {
System.out.println(a);
return false;
});
安装
将这两个标签添加到所有 pom.xml 文件中,或者添加到某处的公司主 pom 中:
<build>
<plugins>
<plugin>
<groupId>de.westemeyer</groupId>
<artifactId>artifact-version-maven-plugin</artifactId>
<version>1.1.0</version>
<executions>
<execution>
<goals>
<goal>generate-service</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>de.westemeyer</groupId>
<artifactId>artifact-version-service</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>