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