如何在生成我的应用程序的最终.jar文件的ANT目标中包含.jar依赖项?

时间:2015-02-11 15:58:27

标签: java ant jar build

我是Ant的新手,我在创建 build.xml 文件时出现以下问题,该文件处理以下单个类应用程序的 .jar 文件的创建:

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 对象)。

要获得连接,请使用代表Oracle DB Driver的此类 oracle.jdbc.OracleDriver 。此类包含在名为 ojdbc6.jar 的jar文件中,该文件放在项目的 lib 文件夹中。

所以我有以下项目结构:

**edi-sta** (the project root)
     |
     |----> **lib**
     |         |
     |         |-------> **ojdbc6.jar**
     |
     |----> **src**
     |         |
     |         |-------> **Main.java**
     |
     |----> **build.xml**

所以我创建了这个 build.xml 文件:

<project name="edi-sta">

    <description>
        EDI-STA
    </description>

    <!-- ========================================================================= -->
    <!-- === Project Paths ======================================================= -->
    <!-- ========================================================================= -->

    <property name="project.base.dir" value="."/>

    <!-- ========================================================================= -->
    <!-- === DO NOT EDIT BELOW THIS LINE ========================================= -->
    <!-- ========================================================================= -->
    <!-- === Library Names ======================================================= -->
    <!-- ========================================================================= -->

    <property name="libname.ojdbc6" value="ojdbc6.jar"/>  <!-- JDBC DRIVER FOR ORACLE DB -->

    <!-- =================================================================== -->
    <!-- =========================== Classpath ============================= -->
    <!-- =================================================================== -->
    <fileset id="classpath.jars" dir="${project.base.dir}/lib">
        <include name="${libname.ojdbc6}" />
    </fileset>

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

    <target name="compile" depends="clean">
        <mkdir dir="build/classes"/>

        <echo>INTO compile TASK</echo>

        <javac srcdir="src" destdir="build/classes" />

    </target>

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

        </jar>
    </target>

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

</project>

问题在于,在此阶段,当我尝试在控制台中执行 Main.jar 时,我以这种方式获得 ClassNotFoundException

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> 

这是因为我不知道如何正确包含 ojdbc6.jar (包含Oracle驱动程序 oracle.jdbc.OracleDriver 的文件)。

所以我认为我必须在 jar 目标中执行此操作,因此我准备了字段集 id =“classpath.jars”我推出 ojdbc6.jar

但是现在我有什么办法用它来解决我的问题?我错过了什么?

TNX

1 个答案:

答案 0 :(得分:1)

基本上你要问的是我如何将一个jar文件打包到另一个jar文件中,你不应该这样做(出于很多原因,一个是几乎所有的许可证)。

当你运行时,在运行时编译 AND ,你需要在类路径上使用jdbc jar:

使用以下命令运行:

java -cp ./lib/ojdbc6.jar -jar Main.jar

或类似

java -cp Main.jar:./lib/ojdbc6.jar Main

build.xml中的run目标也需要引用类路径。