1

这更多是关于那里有什么的问题,以及关于解决工具(如Ivy. 有什么可以提到class-level包的依赖关系而不是package level依赖关系吗?
例如,假设我有一个apache-xyxy package, 附带一个ivy.xml列出所有依赖项的 ,。但是假设我只使用WXapache-xyxy 中的类,它不需要大多数依赖项。解析器不能是智能的吗并确定类 WX 只能调用其他类(AB、DC、EF)的集合,并且这些类都不使用任何其他依赖项,以创建所需依赖项的最小子集?这将比樱桃采摘更容易和更安全,以删除由于该包中使用的特定类而不需要的一些包依赖关系,并且还可以防止仅仅因为这个原因将几个较大的包分解成较小的包。

然后,如果我后来决定使用 apache-xyxy 中的 GH 类,我可以做一个 ivy 解析,它会动态引入额外的所需库。

4

1 回答 1

2

在打包已编译的 Java 代码以进行分发时,通常将 Java“包”捆绑在一起。将一个 java 包拆分为多个 jar 也是很可能的(但很愚蠢)。大型框架(如 Spring)在不同的 jar 中包含许多子包,因此用户可以在运行时选择他们需要的内容.....当然,jar 选项越多,填充运行时类路径...

这里的关键字是“运行时”...... Apache ivyApache Maven等工具主要用于管理构建时所需的依赖关系......

Apache Maven确实有一个“运行时”范围,因为它是依赖项,但它仅限于单个 jar 列表。通常,此范围用于确定需要哪些 jar 来测试和填充 WAR 文件的 lib 目录。

Apache ivy有一个类似的更灵活的机制,称为“配置”。可以根据需要创建任意数量的运行时配置,这些配置可用于决定 ivy 下载哪些 jar。因此,虽然看起来常春藤有答案,但我很少看到常春藤在启动程序时使用(一个例外是 Groovy 的Grape 注释

那么,你可能会问,答案是什么?

“运行时”类路径管理的未来是OSGI项目拼图。我更熟悉 OSGI,在 jar 文件的清单中添加了特殊的依赖项指示符,说明它的依赖项是什么。这个想法是,当一个容器加载一个 jar(称为“包”)时,它可以检查并查看其他依赖项是否已经加载。这些依赖关系可以从公共存储库中检索和加载。这是启动java的根本不同方式。传统上,每个应用程序都加载到它自己的隔离类路径中......

Time will tell if either project catches on. In the meantime we use Apache ivy and Apache Maven to build self-contained and possibly over-bloated WAR (EAR, etc) packages.

于 2012-07-11T19:20:20.503 回答