我是 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
答案 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"/>
....