我读了很多关于这方面的文章/解释,花了很多时间,但每件事都太宽泛或太具体了。
这个问题实际上只适用于我制作的Applet。它包含一个类,并需要另外两个Jar库。我已经在项目中包含了这些(多个项目,因为我已经在Netbeans和Eclipse中尝试过了…很容易重新创建一个Class项目)。所有这一切的重点是,我的HTML/web项目不应该必须处理多个Jar或引用它们。它也不是一个复杂的applet/project。
最初,我是在Netbeans中制作的。它有主包,在添加2个jar之后,它们被放在"Libraries"区域("resources"文件夹)中。在构建它之后,Netbeans为我的一个包/类创建一个Jar,然后将其他2个库放在它旁边的lib目录中。我想把它们放在一个可分发的罐子里。从我查看的许多内容中,我尝试在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那里得到了这个——部署在一个罐子里。我不知道/理解如何使用build.xml,所以如果出现问题(显然),我不会感到惊讶,但我没有得到错误/警告消息。
当我在Eclipse中创建它时,它有效地组合了它们,但是当我在实际的web项目中使用Jar时,它说它无法从其他2个Jar中找到类。我不明白如何修复它,但它是一个类路径问题吗?在Eclipse中,我创建了一个名为"lib"的新目录,并将jar文件放入其中。然后,我右键单击项目,转到"Java Build Path",并添加jar,同时在"Order and Export"选项卡下检查它们。从我读过的东西,我右键单击项目,选择"导出",选择"Jar",取消选中"。类路径"one_answers"。项目"文件,只勾选"导出生成的类文件和资源",然后允许它生成manifest文件。就像我说的,这会生成一个Jar,但是它的内容是我的包,然后是一个包含另外两个Jar的"lib"目录。Manifest在那里,但它非常空,没有引用任何文件(不确定这是否重要)。当我把它放到我的web应用程序中时,它说applet找不到其他类。
这看起来很简单——一个包/类,两个外部Jar…在作为applet构建分发时组合成一个Jar。什么好主意吗?
更新:
自从我们开始使用Maven,有人就开始研究使用Maven插件。所以我们最终创建了一个新项目来容纳applet(因为它在多个项目中使用),并在我们的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来部署applet。
然而,如果你觉得你必须把你的类和它所有的依赖关系做成一个大的jar,那么你可以这么做。
你不能把jar文件放到另一个jar文件中,但是- jar文件不能这样工作。您需要的是将所有jar文件的所有内容提取出来,然后再次压缩到一个jar中。
如果你打算这样做,我建议使用Maven构建工具来做。一旦你用Maven建立了你的构建,你就可以配置Maven组装插件来为你构建一个大的jar。
我知道Eclipse支持Maven,我假设NetBeans也支持。
从bin目录的底部,为什么不试试:
jar.exe -cvf cxapplet.jar *
将您的外部jar文件放在您的bin
目录中的适当位置,并将您的类文件与外部jar文件手动jar。