我正在编写一个自定义工具来从我们的构建树构建 jar 文件。我们喜欢构建仅包含 .class
的“最小”jar 文件。文件实际上是从“根”类(main() 所在的位置)引用的,依此类推,递归地遵循依赖关系。
从历史上看,我们是通过获取javac
来做到这一点的。遵循源依赖关系,但这意味着要多次重新编译公共(public)文件。 (我们从单个源树构建 60 或 70 个不同的应用程序 jar。)我正在编写一个新的构建系统,该系统仅编译每个源文件一次,但这意味着我们需要通过解析 .class 文件来遵循依赖关系。
好消息是,我已经有了可以完成我想要的工作的代码。但我需要绝对确定我没有搞砸,即我想确保我正在构建内部一致的 jar 文件,其中“一致”意味着所有未解析的引用都可以通过以下方式解决:我们已知的第三方 jar 之一。
所以理想情况下我想要一个可以像这样运行的 MagicTool
MagicTool \
--classpath commons-lang.jar:commons-collections.jar:[...etc...] \
myapp.jar
这将检查 myapp.jar
中每个未解析的引用并确保它可以通过传递给 --classpath
的第三方 jar 之一来解析。如果没有,呕吐。
最佳答案
最好希望该路径中没有任何内容包含任何类型的反射、forName
等。
我使用depfind (如果我没有使用自己的 Java 洞穴探险工具)它可能会也可能不会以对您有帮助的方式提供输出。 jdepend是另一种选择,尽管我从未将其用于包级依赖项之外的任何其他用途。
其他工具(例如 ProGuard)将删除未使用的类(除其他外),并具有相同的反射警告。
我非常谨慎地尝试太创建最小的 jar 文件;存在 yield 递减/风险增加的点。
关于java - 如何测试我的 jar 文件是否有任何 Unresolved 依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8218338/