Java运行时依赖项

Java运行时依赖项,java,dependencies,Java,Dependencies,有没有办法确定Java应用程序所需的所有运行时依赖项是否都存在于类路径中 我想在所有可能的执行路径中多次运行应用程序,并检查是否引发“未找到类”异常是确保所有需要的类都在类路径中的一种方法,但对于复杂的应用程序来说,这当然不总是一个选项。听起来像是需要一个linter。我不确定您使用的是什么IDE,但我建议您使用SonarLint,因为它是最流行的Linter之一。您可以使用工具JDEP检查类路径中的依赖项(如果在JDK 9之前),但它不能帮助您检查所有源代码,只能应用于独立的Java类 自JD

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


我想在所有可能的执行路径中多次运行应用程序,并检查是否引发“未找到类”异常是确保所有需要的类都在类路径中的一种方法,但对于复杂的应用程序来说,这当然不总是一个选项。

听起来像是需要一个linter。我不确定您使用的是什么IDE,但我建议您使用SonarLint,因为它是最流行的Linter之一。

您可以使用工具
JDEP
检查类路径中的依赖项(如果在JDK 9之前),但它不能帮助您检查所有源代码,只能应用于独立的Java类

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

阅读更多

(搜索关键字
需要

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

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

java
命令——虽然它本身不是用java实现的——很好地说明了这一点:它接受应用程序主类的名称作为命令行参数。因此,它所需要的类不能静态地确定;它们取决于命令行参数。Java程序也可以做类似的事情,而且这种使用在某些领域是例行的。例如,JDBC驱动程序通常是按名称进行反射加载的,通常将驱动程序名称记录在配置文件中,而不是硬编码

另一方面,类加载器可以从远程源加载类并动态合成类,因此即使在文件系统的任何位置都看不到特定的类,也很难确定它在运行时是否可用。还有其他有趣的类加载器游戏,有时也会玩

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


因此,总体而言,执行事后确定(如您所述)的唯一可靠方法是测试所有代码路径,以及可能影响所需类的所有相关数据变化。

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

  • 马文:
  • 格拉德尔:

这些类型的经理从中央存储库下载您需要的JAR和他们需要的所有JAR,并为您完成所有这些工作。

如果这很重要,请创建一个胖JAR:OP's talking for runtime。Maven/gradle更适合于项目开发/编译/构建。