我正在尝试构建一个依赖于外部jar下载的可执行jar程序。在我的项目中,我将它们包含在构建路径中,并且可以在eclipse中运行和调试。
当我尝试将它导出到jar时,我可以运行程序,但是当我尝试按下包含来自外部jar的函数调用和类的按钮时,我无法运行。我编辑了环境变量(Windows XP)CLASSPATH以包含所有外部jar的路径,但它不起作用。
值得注意的是,我在导出可执行jar时遇到了编译警告,但它没有显示有关警告的任何描述。
有人会提供一个关于如何使用eclipse包含外部jar程序的详尽指南吗?
答案 0 :(得分:36)
Eclipse 3.5可以选择将所需的库打包到runnable jar中。 档案 - >出口... 选择runnable jar并单击“下一步”。 可运行的jar导出窗口有一个单选按钮,您可以在其中选择将所需的库打包到jar中。
答案 1 :(得分:14)
您可以writing a manifest为jar执行此操作。看看Class-Path标题。 Eclipse可以选择在导出时选择自己的清单。
另一种方法是在调用应用程序时将依赖项添加到类路径:
win32: java.exe -cp app.jar;dependency.jar foo.MyMainClass
*nix: java -cp app.jar:dependency.jar foo.MyMainClass
答案 2 :(得分:8)
如何将项目的jar包含在可运行的jar中:
我正在使用Eclipse版本:3.7.2在Ubuntu 12.10上运行。我还将向您展示如何制作build.xml
,以便您可以从命令行执行ant jar
并使用提取到其中的其他导入的jar创建您的jar。
基本上你要求Eclipse构建build.xml,将你的库导入jar中。
启动Eclipse并创建一个新的Java项目,创建一个新的包'mypackage',添加您的主类:Runner
将此代码放在那里。
现在包含mysql-connector-java-5.1.28-bin.jar
from Oracle,它使我们能够编写Java来连接MySQL数据库。通过右键单击项目来执行此操作 - >属性 - > java构建路径 - >添加外部罐子 - >选择mysql-connector-java-5.1.28-bin.jar。
在eclipse中运行程序,它应该运行,并告诉你用户名/密码无效,这意味着Eclipse已经正确配置了jar。
在Eclipse中转到File
- > Export
- > Java
- > Runnable Jar File
。您将看到此对话框:
确保设置'另存为ant脚本'复选框。这就是为什么你可以使用命令行稍后进行ant jar
。
然后转到终端并查看ant脚本:
所以你看,我运行了jar并且它没有错误,因为它发现mysql-connector-java-5.1.28-bin.jar
内嵌了Hello.jar
。
查看Hello.jar:vi Hello.jar
,你会看到许多对com/mysql/jdbc/stuff.class
的引用
要在命令行上执行ant jar
以自动完成所有这些操作:将buildant.xml
重命名为build.xml
,并将目标名称从create_run_jar
更改为jar
。
然后,在MyProject
内,您输入ant jar
并繁荣。你在MyProject中有你的jar。你可以使用java -jar Hello.jar
调用它,一切正常。
答案 3 :(得分:5)
作为一种好的做法,您可以使用Ant Script(Eclipse附带它)来生成JAR文件。在这个JAR中你可以拥有所有依赖的库。
您甚至可以将MANIFEST的Class-path标头设置为指向文件系统中的文件,但这不是一个好习惯。
Ant build.xml脚本示例:
<project name="jar with libs" default="compile and build" basedir=".">
<!-- this is used at compile time -->
<path id="example-classpath">
<pathelement location="${root-dir}" />
<fileset dir="D:/LIC/xalan-j_2_7_1" includes="*.jar" />
</path>
<target name="compile and build">
<!-- deletes previously created jar -->
<delete file="test.jar" />
<!-- compile your code and drop .class into "bin" directory -->
<javac srcdir="${basedir}" destdir="bin" debug="true" deprecation="on">
<!-- this is telling the compiler where are the dependencies -->
<classpath refid="example-classpath" />
</javac>
<!-- copy the JARs that you need to "bin" directory -->
<copy todir="bin">
<fileset dir="D:/LIC/xalan-j_2_7_1" includes="*.jar" />
</copy>
<!-- creates your jar with the contents inside "bin" (now with your .class and .jar dependencies) -->
<jar destfile="test.jar" basedir="bin" duplicate="preserve">
<manifest>
<!-- Who is building this jar? -->
<attribute name="Built-By" value="${user.name}" />
<!-- Information about the program itself -->
<attribute name="Implementation-Vendor" value="ACME inc." />
<attribute name="Implementation-Title" value="GreatProduct" />
<attribute name="Implementation-Version" value="1.0.0beta2" />
<!-- this tells which class should run when executing your jar -->
<attribute name="Main-class" value="ApplyXPath" />
</manifest>
</jar>
</target>
答案 4 :(得分:2)
尝试fat-jar扩展。它将包括罐子里面的所有外部罐子。
答案 5 :(得分:0)