草庐IT

java - 如何将多个 jar 合并为一个?

coder 2023-09-02 原文

我已经阅读了很多关于此的文章/解释并花费了太多时间,但一切都太宽泛或太具体。

这个问题真的只适用于我制作的Applet。它包含一个类,并需要 2 个其他 Jar 库。我已经将这些包含在项目中(多个项目,因为我已经在 Netbeans 和 Eclipse 中尝试过这个……很容易重新创建一个类项目)。所有这一切的要点是我的 HTML/web 项目不必处理多个 Jar 或引用它们。这也不是一个复杂的小程序/项目。

最初,我是在 Netbeans 中制作的。它有主包,在添加 2 个 Jar 后,它们被放在“库”区域(“资源”文件夹)中。构建它之后,Netbeans 为我的一个包/类创建了一个 Jar,然后将其他 2 个库放在它旁边的“lib”目录中。我希望它们在一个可分发的 Jar 中。从我看过的许多东西中,我尝试将以下内容放入 build.xml 中:

<target name="YourBigJar" depends="-post-jar">
  <jar destfile="dist/BigJar.jar">
    <zipfileset src="dist/cxapplet.jar"/>
    <zipfileset src="resources/dpotapi.jar"/>
    <zipfileset src="resources/dpotjni.jar"/>
  </jar>
</target>

但它什么也没产生。我从 NetBeans - deploying all in one jar 得到这个.我不知道/理解如何使用 build.xml,所以如果出现问题我不会感到惊讶(显然),但我没有收到任何错误/警告消息。

当我在 Eclipse 中创建它时,它有效地结合了它们,但是当我在我的实际 Web 项目中使用 Jar 时,它说它无法从其他 2 个 Jar 中找到类。我不明白如何修复它,但这是一个类路径问题吗?在 Eclipse 中,我创建了一个名为“lib”的新目录,并将 Jar 文件放入其中。然后,我右键单击项目,转到“Java Build Path”,添加 Jars,同时在“Order and Export”选项卡下选中它们。从我读过的内容来看,我右键单击项目,选择“导出”,选择“Jar”,取消选中“.classpath”和“.project”文件,只选中“导出生成的类文件和资源”,然后允许它生成 list 文件。就像我说的,这会生成一个 Jar,但它的内容是我的包,然后是一个包含其他 2 个 Jar 的“lib”目录。 Manifest 在那里,但它非常空并且没有引用任何文件(不确定这是否重要)。当我将它放入我的网络应用程序时,它说小程序找不到其他类。

它看起来很简单 - 一个包/类,两个外部 Jars...在构建为作为 applet 分发时组合成一个 Jar。有什么想法吗?

更新:

自从我们开始使用 Maven 以来,有人研究过使用 Maven 插件。所以我们最终创建了一个新项目来容纳小程序(因为它在多个项目中使用),并在我们的 pom.xml 中使用它,最后:

<build>
  <resources>
    <resource>
      <directory>${basedir}/applet</directory>
      <excludes>
        <exclude>codesignstore</exclude>
      </excludes>
    </resource>
    <resource>
      <directory>${basedir}/src/main/resources</directory>
      <filtering>true</filtering>
    </resource>
  </resources>
  <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>2.2-beta-5</version>
      <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <finalName>cxapplet</finalName>
        <archive>
          <index>true</index>
          <manifest>
            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
          </manifest>
        </archive>
        <appendAssemblyId>false</appendAssemblyId>
      </configuration>
      <executions>
        <execution>
          <id>make-my-applet-jar</id>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jarsigner-plugin</artifactId>
      <version>1.2</version>
      <executions>
        <execution>
          <id>sign</id>
          <goals>
            <goal>sign</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <keystore>${basedir}/applet/codesignstore</keystore>
        <alias>codesigncert</alias>
        <storepass>HIDDEN</storepass>
        <keypass>HIDDEN</keypass>
      </configuration>
    </plugin>
  </plugins>
</build>

这很好,因为它允许我们使用我们的代码签名证书来自动签名。

最佳答案

首先,让我说真的没有理由组合这些 jar - 您可以使用您的类文件(不在 jar 中)及其单独的依赖 jar 部署一个小程序。

但是,如果您觉得必须从您的类及其所有依赖项中创建一个大 jar,那么您可以这样做。

您不能将 jar 文件放入另一个 jar 文件,但是 - jar 文件不能那样工作。 您需要的是提取所有 jar 文件的所有内容,然后再次压缩到一个 jar 中。

如果您要这样做,我建议您使用 Maven构建工具来做到这一点。 使用 Maven 设置构建后,您可以配置 Maven Assembly Plugin为你 build 一个大 jar 。

我知道 Eclipse 支持 Maven,我认为 NetBeans 也支持。

关于java - 如何将多个 jar 合并为一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14350150/

有关java - 如何将多个 jar 合并为一个?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  6. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  7. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  8. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  9. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  10. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

随机推荐