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

问题描述 投票:-3回答:1

我是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数据库的连接(由Connection 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>

之后我按顺序执行了clean,compile和jar目标,我试图打开控制台,访问包含Main.jar文件的build / 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文件),但我没有ojdbc6。包含我使用的Oracle驱动程序的jar文件。

所以我的问题是:我有什么办法在我生成的Main.jar文件中正确包含这个ojdbc6.jar依赖项并避免ClassNotFoundException?

TNX

java ant jar build executable-jar
1个回答
-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"/> 
                ....
© www.soinside.com 2019 - 2024. All rights reserved.