Eclipse:如何使用外部jar构建可执行jar?

时间:2009-02-02 11:56:55

标签: java eclipse jar classpath external

我正在尝试构建一个依赖于外部jar下载的可执行jar程序。在我的项目中,我将它们包含在构建路径中,并且可以在eclipse中运行和调试。

当我尝试将它导出到jar时,我可以运行程序,但是当我尝试按下包含来自外部jar的函数调用和类的按钮时,我无法运行。我编辑了环境变量(Windows XP)CLASSPATH以包含所有外部jar的路径,但它不起作用。

值得注意的是,我在导出可执行jar时遇到了编译警告,但它没有显示有关警告的任何描述。

有人会提供一个关于如何使用eclipse包含外部jar程序的详尽指南吗?

6 个答案:

答案 0 :(得分:36)

Eclipse 3.5可以选择将所需的库打包到runnable jar中。 档案 - >出口... 选择runnable jar并单击“下一步”。 可运行的jar导出窗口有一个单选按钮,您可以在其中选择将所需的库打包到jar中。

答案 1 :(得分:14)

您可以writing a manifestjar执行此操作。看看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中。

  1. 启动Eclipse并创建一个新的Java项目,创建一个新的包'mypackage',添加您的主类:Runner将此代码放在那里。

    enter image description here

  2. 现在包含mysql-connector-java-5.1.28-bin.jar from Oracle,它使我们能够编写Java来连接MySQL数据库。通过右键单击项目来执行此操作 - >属性 - > java构建路径 - >添加外部罐子 - >选择mysql-connector-java-5.1.28-bin.jar。

  3. 在eclipse中运行程序,它应该运行,并告诉你用户名/密码无效,这意味着Eclipse已经正确配置了jar。

  4. 在Eclipse中转到File - > Export - > Java - > Runnable Jar File。您将看到此对话框:

    enter image description here

    确保设置'另存为ant脚本'复选框。这就是为什么你可以使用命令行稍后进行ant jar

  5. 然后转到终端并查看ant脚本:

    enter image description here

  6. 所以你看,我运行了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)