【问题标题】:How to combine two Jar files如何合并两个Jar文件
【发布时间】:2011-02-22 15:35:10
【问题描述】:

是否可以合并两个 jar 文件,以便在 applet 标记中我可以简单地执行类似的操作

archive="jarjar.jar/jar1.jar"...  ...archive="jarjar.jar/jar2.jar"... instead of
archive="jar1.jar"... ...archive="jar2.jar"...

我只需要一个 jar 文件,因此将两个 jar 文件放在一个文件夹中对我没有帮助。

【问题讨论】:

    标签: java applet


    【解决方案1】:

    当然,只需提取两个 jar 文件并重新创建一个新的

    $ mkdir tmp
    $ (cd tmp; unzip -uo ../jar1.jar)
    $ (cd tmp; unzip -uo ../jar2.jar)
    $ jar -cvf combined.jar -C tmp .
    

    tmp 的东西确保将两个现有的 jar 提取到一个干净的目录中,然后从该目录中提取新的。

    请注意,您可能还需要合并其中包含的任何 manifest.mf 文件,如果有的话,还需要在该文件命令中包含“-m”选项。

    【讨论】:

    • 如果您有一个不区分大小写的文件系统并且这些 jar 包含具有相同名称的类(通常如果它们被保护),则此方法将不起作用
    【解决方案2】:

    将 zipgroupfileset 与 Ant Zip task 一起使用

    <zip destfile="out.jar">
        <zipgroupfileset dir="lib" includes="*.jar"/>
    </zip>
    

    可能会对你有所帮助。

    【讨论】:

      【解决方案3】:

      如果您使用的是 gradle,只需将以下内容添加到 build.gradle。不需要插件。如果您需要特殊选项,请按照 initialZero 的建议使用 Fatjar 插件。

      task superSimpleJar(type: Jar) {
          baseName = project.name + '-all'
          from { configurations.compile.collect { it.isDirectory() ? it :     zipTree(it) } }
          with jar
      }
      

      对于 Android 项目,将其添加到 app/build.gradle 并运行“gradlew superSimpleJar”。在 build/libs/app-all.jar 中找到 jar

      task superSimpleJar(type: Jar) {
      baseName = project.name + '-all'
      from {
      
          configurations.compile.findAll {
      
          it.getName() != 'android.jar'
      
          }.collect {
      
          it.isDirectory() ? it : zipTree(it)
      
          }
       }
      }
      

      【讨论】:

      • * 出了什么问题:评估项目 ':android-lib' 时出现问题。 > 在任务 ':android-lib:superSimpleJar' 上找不到属性 'jar'。
      • 刚刚添加了一个安卓版本。祝你好运,edthethird。
      • 同样的错误。 “在任务中找不到属性 'jar'”我该如何解决这个问题?
      【解决方案4】:
      <?xml version="1.0" encoding="UTF-8"?>
      <project name="zip-test" default="zip" basedir=".">
      
          <target name="zip">
              <zip destfile="out.jar">
                  <zipgroupfileset dir="." includes="*.jar"/>
              </zip>
          </target>
      </project>
      

      将此代码保存在build.xml 文件中,并将其保存在保存所有要组合的jar 文件的同一文件夹中。打开cmd,给出文件夹路径并运行命令:ant zip

      它将生成out.jar,它是所有jar的组合。

      【讨论】:

        【解决方案5】:

        只需解压缩两个 jar 文件,然后将结果压缩到一个 zip 文件中,然后再次将其重命名为 jar。

        但正如 adarshr 所说:最好使用 jar 命令。

        【讨论】:

        • 如果这样做,您将丢失或覆盖 MANIFEST.MF。最好使用jar命令。
        • @adarshr:无论如何,您都必须合并两个清单文件,jar 命令不会自动执行此操作。实际上,您的答案的 jar 命令只是忽略了各个清单并创建了一个新清单。
        • 当您正在处理的远程系统没有“jar”命令并且您不想为一次性操作设置 ant 任务时很有用。
        【解决方案6】:

        提取两个罐子并创建一个新的作品。 (使用上面显示的 jar 命令)。 关于清单文件的一个警告是,您要提取最后要保留其清单文件的 jar。

        【讨论】:

        • 这与几年前发布并接受的答案相同?
        【解决方案7】:

        我知道这是一个老问题,我只想加两分钱(还没有评论的权限,所以创建一个新答案)。

        我确实看到了 sumanth.donthula 的答案的价值,因为我们所有人合并 jar 的问题将是如何处理清单文件。就我而言,我想将一些库文件(主要是生成的 Web 服务客户端代码)合并到我编写的应用程序的 jar 中。可以用我自己的 jar 替换清单。

        执行此操作的最简单方法是注意解压缩原始文件的顺序(如 Alnitak 和 sumanth.donthula 所述)。

        我想使用 zip ant 任务(感谢 ykombinator 的创意)。事实证明,控制压缩/打包顺序的唯一方法是重命名文件。请参阅下面的我的蚂蚁目标。

        我的示例中的输出目录称为 codemodule.dir(我创建了一个 FileNet 代码模块)。其余的名称是不言自明的。重要的一步是将应用程序 jar 重命名为 0_... 按顺序排列第一个。这样,它的清单将被保留,因为 zip ant 任务的重复属性设置为保留。

        <target name="merge_jars">
            <delete dir="${codemodule.dir}" quiet="true" />
            <mkdir dir="${codemodule.dir}" />
            <copy todir="${codemodule.dir}">
                <fileset dir="${lib.dir}" includes="*.jar"/>
                <fileset dir="${basedir}" includes="${app-name}.jar"/>
            </copy>
            <move file="${codemodule.dir}/${app-name}.jar" tofile="${codemodule.dir}/0_${app-name}.jar"/>
            <zip destfile="${codemodule.dir}/${app-name}-fat.jar" duplicate="preserve">
              <zipgroupfileset dir="${codemodule.dir}">
                <include name="*.jar"/>
              </zipgroupfileset>
            </zip>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多