如何将jar依赖项正确导入到Ant生成的.jar文件中?

时间:2015-02-11 14:16:46

标签: java ant jar build executable-jar

我是 Ant 中的新手,我在尝试创建 build.xml 文件以编译单个类(包含 main)时遇到以下问题()方法)命令行应用程序。

所以这是 Main 类的代码(此时它是应用程序中唯一的类):

import java.sql.*;
import java.util.TimeZone;


public class Main {

    public static void main(String[] args) {
        System.out.println("Hello World !!!");

        System.out.println(args.length);

        if(args.length != 0) {
            String partitaIVA = args[0];
            String nomePDF = args[1];
        }

        Connection conn = null;
        Statement  stmt = null;

        try {
            Class.forName ("oracle.jdbc.OracleDriver");

            TimeZone timeZone = TimeZone.getTimeZone("Etc/GMT+2");
            TimeZone.setDefault(timeZone);

            // Step 1: Allocate a database "Connection" object
            conn = DriverManager.getConnection("jdbc:oracle:thin:@XXX.XXX.XXX.XXX:1521:eme1", "myUserName", "myPswd");    // Oracle DB driver 

            System.out.println("After obtained connection with DB");

        } catch(SQLException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }
}

正如您所看到的, main()方法的行为非常简单,此时只获得与 Oracle 数据库的连接(由连接conn 对象)。运行它到IDE(我使用 IntelliJ)它工作正常(我可以使用调试器看到它​​,**连接conn 已正确设置)。

现在我正在为 Ant 编译开发以下 build.xml 文件:

<project name="edi-sta">

    <description>
        EDI-STA
    </description>

    <target name="clean">
        <delete dir="build"/>
    </target>

    <target name="compile">
        <mkdir dir="build/classes"/>
        <javac srcdir="src" destdir="build/classes"/>
    </target>

    <target name="jar">
        <mkdir dir="build/jar"/>
        <jar destfile="build/jar/Main.jar" basedir="build/classes">
            <manifest>
                <attribute name="Main-Class" value="Main"/>
            </manifest>
        </jar>
    </target>

    <target name="run">
        <java jar="build/jar/Main.jar" fork="true"/>
    </target>

</project>

之后我按顺序执行清理编译 jar 目标我尝试打开控制台,访问 build / jar / 包含 Main.jar 文件的目录,我尝试执行它,执行以下语句:

C:\Projects\edi-sta\build\jar>java -jar Main.jar
Hello World !!!
0
java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at Main.main(Unknown Source)

C:\Projects\edi-sta\build\jar> 
但是,正如你所看到的,现在发生了一件非常奇怪的事情,似乎找不到包含Oracle驱动程序的类( oracle.jdbc.OracleDriver )所以抛出ClassNotFoundException

我认为这是因为如果我打开(使用WinZip)生成的 Main.jar 文件,它只包含 Main.class 文件和 META -INF 文件夹(仅包含MANIFEST.MF文件)但我没有包含我使用的Oracle驱动程序的 ojdbc6.jar 文件。

所以我的问题是:如何在生成的 Main.jar 文件中正确包含此 ojdbc6.jar 依赖项,并避免 ClassNotFoundException < /强>

TNX

1 个答案:

答案 0 :(得分:-1)

您可以在jar的清单文件的Class-Path属性中定义jar依赖项。请阅读此处的文档 - http://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

要从您的ant任务中实现这一点,请使用Class-Path属性,如下所示

  <jar destfile="build/jar/Main.jar" basedir="build/classes">
            <manifest>
                <attribute name="Main-Class" value="Main"/>
                <attribute name="Class-Path" value="your-jar-file"/> 
                ....