【问题标题】:How to add your own .class into a compiled .jar file?如何将自己的 .class 添加到已编译的 .jar 文件中?
【发布时间】:2016-04-22 14:22:02
【问题描述】:

我有一个 .jar,我想将我自己的 .class 添加到它并重新编译。有什么地方我可以做到吗?

【问题讨论】:

    标签: java


    【解决方案1】:

    是的,而且很简单(如果您已经拥有 .class 文件 - 则无需重新编译)。

    (假设你已经有了.class文件,只是想把它添加到.jar中。如果你没有.class文件,你需要写一个.java源文件,然后先编译成.class使用 javac)

    Jar 文件实际上是 zip 文件 - 您可以使用 zip/unzip 来创建和解压缩它们。

    1. 使用解压程序解压 jar 文件
    2. 将您的课程添加到解压缩目录 (*)
    3. 再次压缩(可能是另一个名称.jar)

    (*) 在第 2 步中,您必须将 .class 文件放在 正确 目录中 - 正确意味着 包名称您的类必须与 .class 文件所在的目录路径相匹配,相对于 .jar 归档根目录

    例如,如果您的 My.class 定义它在包 com.nicky 中,那么它必须在 com/nicky/My.class 中找到(其中 com 是存档根目录中的一个目录)。如果 My.class 没有包,则它们必须在归档根目录中。

    不需要重新编译 - Java 会在运行时动态链接 - 如果程序的其余部分需要使用类 com.nicky.My,它将成功完成如果类文件在 .jar 文件中的正确位置。

    您使用虚拟机的 classpath 参数 (java -cp a.jar:b.jar:... ) 告诉 java 进程在哪里查找对于类 - 如果将您的类打包在一个单独的 .jar 文件中会更有意义..

    -- 编辑 1 / 回复您的评论: 如果您要编写一个新的 .java 文件,您需要先使用 jdk 附带的 javac 命令行编译器将其编译为 .class。

    每个 Java 类都属于一个包,该包通常在 .java 源文件的第一行中声明。对于 .java 源文件(编译成功)和 .class 文件(动态加载/运行成功),包名必须匹配类的目录路径位置(如上例)。

    您还可以下载并使用 Java IDE(例如 http://www.eclipse.org/downloads/packages/eclipse-ide-java-developers/mars2 )来创建您的 .class 文件。在 Eclipse 中创建一个新的 Java 项目,编写您的类源代码,单击构建(如果它已经没有自动构建),然后使用文件资源管理器从磁盘上项目的“目标”目录中获取您的 .class 文件.

    如果您的新 .java 类依赖于您尝试将其添加到的 .jar 中的类,请使用

    javac -cp your.jar com/nicky/My.java

    告诉编译器额外的编译时依赖项在哪里。

    如果您是从 Eclipse 编译,则需要配置您的项目依赖于 your.jar:右键单击您的项目 -> 属性 -> Java 构建路径 -> 库 -> 添加 Jars..强>

    【讨论】:

    • 感谢您快速简洁的回答。假设我正在编写一个新的 .java 文件并将一个 .jar 解压缩到一个名为 A 的文件夹中。在 A 文件夹内有两个文件夹:META-INF 和 org。在 org 中有文件,我想将我的 .java 放入名为 Drive 的文件夹中。然后如何将所有内容编译回 .jar ?
    • 必须将My.java源码编译成My.class文件,然后将My.class文件放入A/package/name/of/your/My.class,然后zip文件夹A到 .jar 文件中。 (在 zip/jar 中必须没有“A”文件夹 - A 文件夹必须是存档根目录)。使用 zip 创建 .jar 很容易,因为不涉及编译 - 棘手的部分可能是将 .java 编译为 .class,这取决于新的 .java 源代码提到/使用的依赖项。
    • 您好 Borut,我下载了 Java IDE 并尝试将我的 .java 编译成 .class。我不知道哪些 JAR 是依赖的,所以我几乎添加了所有。 imgur.com/cCIVJAX 这有点像。然后我去我的工作区复制 IsInBlackList.class 并将其包含到该 .jar 文件的解压缩文件夹中。之后我尝试使用 JD gui 查看 .jar 文件,它说 IsInBlackList.class 有 // 内部错误 // 那里没有代码。
    • 所以这是我的 .class 文件的路径:imgur.com/Zy9dn5V。我试图复制并粘贴到 .jar 文件的这个路径中,即:imgur.com/6iQLAnf。这是行不通的。因为之后 JDgui 显示 IsInBlackList.class 没有代码,只有文本 // INTERNAL ERROR //。你能帮帮我吗?
    • 嗨,在我看来,您发布的图片中的一切都很好,除了您还应该将 IsInBlackList$1.class 复制到 .jar 中 - 因为它包含代码中的匿名内部类。
    猜你喜欢
    • 2012-06-14
    • 2019-01-31
    • 2014-08-12
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 2012-12-02
    相关资源
    最近更新 更多