Eclipse:如何使用外部 jar 构建可执行 jar?
Posted
技术标签:
【中文标题】Eclipse:如何使用外部 jar 构建可执行 jar?【英文标题】:Eclipse: How to build an executable jar with external jar? 【发布时间】:2010-10-04 21:58:24 【问题描述】:我正在尝试构建一个依赖于下载的外部 jar 的可执行 jar 程序。在我的项目中,我将它们包含在构建路径中,并且可以在 eclipse 中运行和调试。
当我尝试将其导出到 jar 时,我可以运行该程序,但当我尝试按下包含来自外部 jar 的函数调用和类的按钮时却不能。我已经编辑了环境变量 (Windows XP) CLASSPATH 以包含所有外部 jar 的路径,但它不起作用。
需要注意的是,我在导出可执行 jar 时收到了编译警告,但它没有显示有关警告的任何描述。
有人能提供关于如何使用 eclipse 包含外部 jar 程序的详尽指南吗?
【问题讨论】:
不要那样做。说真的,永远不要依赖你的 IDE 来创建构建工件,为此目的使用脚本(maven、ant)。 Maven 和 Ant 被提到作为替代品。我可以列出更多晦涩的构建工具,但这两个是标准的。没有必要进一步详细说明,因为已经存在很多关于它们的信息。 【参考方案1】:Eclipse 3.5 可以选择将所需的库打包到可运行的 jar 中。 文件 -> 导出... 选择可运行的 jar,然后单击下一步。 可运行的 jar 导出窗口有一个单选按钮,您可以在其中选择将所需的库打包到 jar 中。
【讨论】:
看起来不错。除了我需要有一个启动配置这一事实。但是创建一个虚拟启动配置是没有问题的。 这(可以)还生成一个 Ant 构建文件,以后可以快速启动(无论是在 IDE 内部还是在 IDE 外部)。两全其美!【参考方案2】:您可以通过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
【讨论】:
后一个建议行不通。当使用-jar
时,-cp
(和-classpath
)参数被忽略。
@BalusC - 你是对的;依赖项需要在清单中。我会编辑答案。
我对此一无所知。在课堂上,他们根本不会深入研究这类事情......很好的提示!
前一个建议也行不通。文档说:The Class-Path header points to classes or JAR files on the local network, not JAR files within the JAR file or classes accessible over internet protocols. To load classes in JAR files within a JAR file into the class path, you must write custom code to load those classes.
@ashes999 没有要求将依赖项 JAR 捆绑在问题中的可执行 JAR 中。原始发帖人说他正在尝试将外部文件系统 JAR 添加到类路径中,您可以使用 Class-Path
执行此操作。【参考方案3】:
如何将项目的 jar 包含到可运行的 jar 中:
我使用的是在 Ubuntu 12.10 上运行的 Eclipse 版本:3.7.2。我还将向您展示如何制作 build.xml
,以便您可以从命令行执行 ant jar
并创建您的 jar,并将其他导入的 jar 提取到其中。
基本上,您要求 Eclipse 为您构建将库导入 jar 的 build.xml。
启动 Eclipse 并创建一个新的 Java 项目,创建一个新包“mypackage”,添加你的主类:Runner
把这段代码放在那里。
现在包括mysql-connector-java-5.1.28-bin.jar
from Oracle,它使我们能够编写Java 来连接到MySQL 数据库。通过右键单击项目 -> 属性 -> java 构建路径 -> 添加外部 Jar -> 选择 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
调用它,一切正常。
【讨论】:
【参考方案4】:作为一种好的做法,您可以使用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>
【讨论】:
【参考方案5】:试试 fat-jar 扩展。它将包括罐子内的所有外部罐子。
更新网址:http://kurucz-grafika.de/fatjar 首页:http://fjep.sourceforge.net/【讨论】:
【参考方案6】:看@ java-jar-ignores-classpath-Workaround
【讨论】:
以上是关于Eclipse:如何使用外部 jar 构建可执行 jar?的主要内容,如果未能解决你的问题,请参考以下文章