c# - .jar 和 .dll 文件之间的区别

标签 c# java

这些天我在学习 Java,我在 .NET 上花了很多时间,所以当我想要导出或导入库时,它们通常是 .dll 格式,在 .NET 环境中称为程序集,它们是经过编译的到 IL,他们可以拥有图像、XML、音频等资源。

我也想知道 Java 中的相同过程。我已经阅读了文档,但它们实际上让我有些困惑,为了澄清问题,我需要你们的帮助。

问题:

  1. .NET Assembly 和 Java .jar 是一回事吗?

  2. .dll 包含已编译的 IL 代码,.jar 包含已编译的 .class/byte 代码文件?

  3. 他们说资源,我们这里说的资源是什么?图片、.txt 文件等或所有这些都可以?

  4. 我检查了 AWS(Amazon Web Service API for java),我看到了三个 .jar 文件,它们是

    1. aws-java-sdk-1.1.1.jar
    2. aws-java-sdk-1.1.1-javadoc.jar
    3. aws-java-sdk-1.1.1-sources.jar

它们包含 .class 文件 - html 格式的 java 文档和尚未编译的 .java 文件。所以我意识到 .jar 不仅仅包含编译后的字节码 (.class) 和其他东西。

  1. 当我要导入 java 库时,是否总是需要导入 .jar 文件?
  2. 当我想导出自己的 java 库时,是否需要导出为 .jar 文件。

提前感谢您的帮助。

最佳答案

.NET 程序集与 Java .jar 是一回事吗?

他们扮演同样的角色,是的。

.dll 包含已编译的 IL 代码,.jar 包含已编译的 .class/byte 代码文件?

是的。虽然 JAR 只是 zip 文件(您可以使用自己喜欢的 Zip 工具打开它们),但它们实际上可以包含任何内容。

他们说资源,我们这里说的资源是什么?图片、.txt 文件等或所有这些都是可能的?

JAR 中允许使用任何文件类型。您的 Java 代码可以通过例如 getResourceAsStream 访问 jar 中文件的内容。或 getResource .显然,JAR 中的 .class 文件被特殊处理(作为字节码)。

我检查了 AWS(Amazon Web Service API for Java),看到了三个 .jar 文件,它们是:aws-java-sdk-1.1.1.jar、aws-java-sdk-1.1。 1-javadoc.jar,aws-java-sdk-1.1.1-sources.jar

上述包装相当常见。有时人们使用 .jar 作为 .zip 的替代文件扩展名。我觉得这种做法令人困惑,但并不少见,亚马逊在这种情况下已经做到了。我认为随着 Maven 的推出,这种做法变得更加普遍,它将引用源代码存储在名为 .jar 的文件中。

aws-java-sdk-1.1.1.jar - 这是编译和执行所需的唯一文件。它包含库运行所需的类(.class 文件)和资源。

aws-java-sdk-1.1.1-sources.jar - 这只是一个 zip 文件,其中包含库的源代码(.java 文件)。它不是编译或执行所必需的。提供它是为了帮助您解决使用库时可能遇到的问题。您可以解压缩此文件并从硬盘读取源代码。但是,您的 IDE 可能可以通过创建主库 JAR 的“源附件”直接使用此文件。在您的 IDE 中设置此库->源关联后,当您在库类上使用 IDE 的“转到定义”功能时,您的 IDE 将能够向您显示库的源代码。

aws-java-sdk-1.1.1-javadoc.jar - 这只是一个包含库的 JavaDoc 的 zip 文件。同样,编译或执行不需要它。 JavaDoc 只是 HTML,因此您可以解压缩此文件并直接从硬盘读取 JavaDoc HTML。但是,大多数 IDE 可以为主库创建“Javadoc 附件”,这允许您从 IDE 中为库提取上下文相关的 JavaDoc。实际上,大多数 IDE 都可以从 -sources.jar 动态生成 JavaDoc,所以我很少再使用 Javadoc jar。

当我要导入 Java 库时,是否总是需要导入 .jar 文件?

通常称为“将 JAR 添加到类路径”,但是是的。您几乎总是需要通过在构建或执行时构建类路径来帮助 Java 找到您正在使用的所有 JAR。一般来说,使用 JAR 和类路径是一个比在 .NET 中使用 DLL 更加手动和显式的过程。例如,Java 没有直接等效于 .NET 的“全局程序集缓存”; vanilla Java 也不会自动从工作目录加载 .jars。

还有一些其他技术可以创建更“自动”的类路径,但它们有点先进:例如,Manifest.MF 类路径是可能的——但这种方法很少使用,因为它很脆弱。从 Java 6 开始,Java 对使用 wildcards in the classpath 的支持有限。 .

当我想导出自己的 Java 库时,是否需要导出为 .jar 文件

这是标准的,是的。

关于c# - .jar 和 .dll 文件之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4411028/

相关文章:

c# - Throttle - 最多每 N 毫秒调用一个函数?

c# - 在 C# 解决方案的 Visual Studio 2010 中查找通用方法名称的所有引用

c# - 我在哪里可以找到一些 "humanized"C# 教程?

java - Eclipse插件: get contents of working set

java - JLS 如何指定术语 "abstract method"、 "concrete method"和 "default method"?

c# - 为什么我的数组被翻转了?

c# - 阅读 Jon Skeet 关于引用与值的章节。还是一头雾水

java - 更改 JLabel 的一部分的字体?

Java ObjectInputStream 从不同应用程序读取

java - 如何从 Android 中的日历对象获取日期?