【问题标题】:How to know what all classes / jar files a Java application uses如何知道 Java 应用程序使用的所有类/jar 文件
【发布时间】:2014-04-01 10:22:09
【问题描述】:

我来自 C/C++ 背景,并且在 Java 中有工作经验。我现在正在转向 Java 语言(因为我觉得我早就应该这样做了)。在 C/C++ 中,如果应用程序已经链接到外部共享库(.so、.a、.sl),我们可以使用 'ld' 命令了解这种依赖关系。

我的问题是,.jar 服务器是否有类似的用途?就像 java 应用程序依赖于 1.jar、2.jar 等一样,这些 jar 文件是否会永远“链接”到 Java 应用程序(导致更大的文件,比如 .a 被 c/c++ 应用程序喜欢,从而导致更大的可执行文件)或动态地(就像 .so / .sl 一样被即时加载,而不是主 c/c++ 应用程序的一部分)。

另外,是否可以列出一个 java 应用程序所依赖的所有 jar 文件?

在 java 中,默认情况下应用程序会导入 java.lang.* 包,这个包是否驻留在 jar 文件中?如果有,该包对应哪些jar文件?

非常感谢!

维平

【问题讨论】:

  • 第一个问题可以通过简单的实验来回答。问题二,不,这就是像 Maven 这样的东西存在的原因。问题三,检查你的 JDK 或 JRE 安装目录。查找 jar 文件。 grep 通过他们列出的内容。问题已回答!
  • 如果您认为 [1] 您可能有不同的类加载器,并且 [2] 您可能有来自不同 jar 的重复类,并且 [3] 您可以指定一个类作为在执行时使用 forName() 动态调用

标签: java class jar


【解决方案1】:

您的应用程序中是否有硬连接?当然不。作为开发人员和部署人员,您有责任跟踪应用程序需要哪些 jar 文件。

默认库(如 JDK API 文档中所定义)包含在一个 jar 文件中,该文件作为 JVM 安装的一部分进行部署,因此您无需提供这些文件。
同样,对于 Java EE,有一个标准集需要服务器提供,在 Java EE API 文档中定义,因此您也不需要发布。
在编写 C 应用程序时,可以将这些类视为操作系统附带的动态库。你不运送那些,你依靠他们在那里。如果不是,您会收到一个错误,即操作系统(如果是 Java,JVM)是​​错误的版本。
有一些工具可以从 Java 类中提取有关导入的信息。有了这些信息,就有可能获取一个装满 jar 文件的目录并编写软件来确定您需要哪些文件,但您实际上应该在开始编写时跟踪这些文件。

【讨论】:

  • 对于 JEE,它不仅仅是“不需要”发布(JEE API),而是“绝对不能”。
【解决方案2】:

您可以查看 META-INF 文件夹中的清单文件。它应该包含应用程序依赖项的声明。一个例子是,类路径是 jar 库要求:

manifest-Version: 1.0
Built-By: melt321
Build-Jdk: 1.6.0_35
Class-Path: dependency-jars/log4j-1.2.17.jar
Created-By: Apache Maven
Main-Class: com.example.org.Tester
Archiver-Version: Plexus Archiver

或者如果 jar 使用的是 maven,你可以检查 pom.xml

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-21
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    相关资源
    最近更新 更多