我正在编写一个自定义工具来构建来自构建树的jar文件。我们喜欢构建“最小”jar文件,其中只包含实际从“root”类引用的.class
文件(其中main()存在) - 依此类推,递归跟随依赖项。
从历史上看,我们通过让javac
遵循源依赖关系来完成此操作,但这意味着要多次重新编译公共文件。 (我们从单个源代码树构建60或70个不同的应用程序jar。)我正在编写一个新的构建系统,只编译每个源文件一次,但这意味着我们需要通过解析.class文件来遵循依赖项。
好消息是,我有能够完成我想要的工作代码。但我需要绝对确定我没有搞砸它,即我想确保我正在构建内部一致的jar文件,其中“一致”意味着所有未解析的引用都可以解决我们已知的第三方罐子之一。
理想情况下,我想要一个可以像
一样运行的MagicToolMagicTool \
--classpath commons-lang.jar:commons-collections.jar:[...etc...] \
myapp.jar
将检查myapp.jar
中的每个未解析的引用,并确保它可以通过传递给--classpath
的第三方jar解析。如果没有,barf。
答案 0 :(得分:2)
更好的希望,在这条道路上没有任何东西包括任何形式的反思,forName
等等。
我使用depfind(如果我没有使用我自己的Java探险工具),它可能会或可能不会以对您有帮助的方式提供输出。 jdepend是另一种选择,尽管我从未将它用于除包级依赖之外的任何其他选项。
像ProGuard这样的其他工具会删除未使用的类(以及其他内容),并使用相同的反射警告。
我非常谨慎地尝试太多难以创建最小的jar文件;有一个收益递减/风险增加的点。
答案 1 :(得分:1)
我很确定ProGuard是你的神奇工具,即使我现在还没有确切的调用语法。
答案 2 :(得分:0)
在几年前的某个阶段,尝试使用jar -i
索引JAR文件,如果存在未解析的依赖项,则会抛出异常。我无法快速测试当前的状态。