Java运行时依赖项

时间:2018-01-18 15:08:53

标签: java dependencies

有没有办法确定类路径中是否存在Java应用程序所需的所有运行时依赖项?

我想在所有可能的执行路径中多次运行应用程序,并且检查否#34; Class not found"抛出异常将是确保所有需要的类都在类路径中的一种方法,但当然,这并不总是复杂应用程序的选项。

4 个答案:

答案 0 :(得分:2)

  

有没有办法确定类路径中是否存在Java应用程序所需的所有运行时依赖项?

在一般情况下,这是不可能的,因为可访问的类文件可能不包含所有必需的信息。特别是,应用程序可能依赖于仅在运行时为其标识的类。

java命令 - 尽管它本身不是用Java实现的 - 是说明性的:它接受应用程序主类的名称作为命令行参数。因此,它不需要静态确定所需的类别;它们依赖于命令行参数。 Java程序可以做类似的事情,这种使用在某些领域是常规的。例如,JDBC驱动程序通常按名称反射加载,并且通常将驱动程序名称记录在配置文件中而不是硬编码。

另一方面,类加载器可以从远程源加载类并动态合成类,所以即使你没有在文件系统的任何地方看到特定的类,也很难成为确定它在运行时不可用。还有其他有趣的类加载器游戏,有时会播放。

现在,对于不受上述类加载考虑因素影响的应用程序,原则上可以通过从应用程序的主类开始的递归检查来确定所有需要的类,并尝试加载所有这些类以验证它们是否可用。但是,即使这样,也有可能因类的不匹配版本而遇到麻烦,因此即使所有想要的(按名称)类都可用,它们也无法正常工作。

总的来说,执行事后决定的唯一可靠方法是测试所有代码路径,以及可能影响所需类的所有相关数据变量。

答案 1 :(得分:1)

您可以在类路径中使用工具jdeps来检查依赖关系(如果在JDK 9之前),但它无法帮助您检查所有源代码,仅适用于独立Java类。

从JDK 9开始,您可以在模块的文件requires内使用模块化,关键字module-info.java。编译Java代码时,它将在编译时检查依赖项。

了解更多信息

https://www.oracle.com/corporate/features/understanding-java-9-modules.html(搜索关键字requires

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jdeps.html

答案 2 :(得分:-1)

听起来你需要一个短绒。我不确定你正在使用什么IDE,但我推荐SonarLint,因为它是那里最受欢迎的硬币之一。

答案 3 :(得分:-1)

我建议使用依赖管理器,如:

这些类型的经理从中央存储库下载您需要的罐子和所需的所有罐子,并为您完成所有这些。