这个问题在这里已有答案:
我是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
您可以在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"/>
....