2011-08-02 32 views
1

试图构建一个java应用程序我能够通过Eclipse成功运行应用程序,但我无法运行由ant构建的jar文件。我怀疑我的build.xml是我的责任,我试图让它正确。需要帮忙!ant应用程序的内置版本无法找到依赖的jar

mysql驱动程序.jar文件位于项目的lib /目录中。

错误:

$ java -jar dist/lib/MyProject.jar 
Loading Mysql JDBC driver... 
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:186) 
    at com.test.bh1.bh.main(Unknown Source) 

bh.java

package com.test.bh1; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class bh { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) {   
     System.out.println("Loading Mysql JDBC driver..."); 
     try { 
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     } catch (Exception e) { 
      msg ("Error instantiating mysql jdbc driver. E=" + e.getMessage()); 
      // bail. 
      return; 
     } 

     msg ("Successfully instantiated mysql jdbc driver. "); 

     Connection con = null; 
     String url = "jdbc:mysql://servername:3306/databasename"; 
     String user = "username"; 
     String password = "password"; 

     try {    
      con = DriverManager.getConnection(url, user, password); 
      Statement st = con.createStatement(); 
      ResultSet result = st.executeQuery("SELECT VERSION()"); 

      if (result.next()) { 
       msg(result.getString(1)); 
      } 

      con.close(); 

     } catch (SQLException ex) { 
      msg(ex.getMessage()); 
     } 

    } 

    private static void msg (String m) { 
     System.out.println(m); 
    } 

} 

的build.xml

<project name="TestProj1" default="dist" basedir="."> 
    <description> 
     Build File For This Project 
    </description> 
    <!-- set global properties for this build --> 
    <property name="src"  location="src"/> 
    <property name="build" location="build"/> 
    <property name="dist"  location="dist"/> 
    <property name="user.name" location="Brad Hein (CQA)"/> 
    <property name="lib.dir" location="lib/"/> 
    <property name="mysql.jar" location="mysql-connector-java-5.0.8-bin.jar"/> 
    <property name="appName.jar" location="${dist}/lib/MyProject.jar"/> 

    <path id="classpath"> 
     <fileset dir="${lib.dir}" includes="**/*.jar"/> 
    </path> 

    <path id="build.classpath"> 
    <pathelement location="${mysql.jar}"/> 
    <pathelement path="${appName.jar}"/> 
    </path> 


    <target name="init"> 
    <!-- Create the time stamp --> 
    <tstamp/> 
    <!-- Create the build directory structure used by compile --> 
    <mkdir dir="${build}"/> 
    </target> 

    <target name="compile" depends="init" 
     description="compile the source " > 
    <!-- Compile the java code from ${src} into ${build} --> 
    <javac srcdir="${src}" destdir="${build}" includeantruntime="false"> 
      <classpath refid="build.classpath"/> 
    </javac> 

    <!-- Copy dependency libraries to the build path so they get packaged up in the distro jar file. --> 
    <copy todir="${build}/lib"> 
     <fileset dir="${lib.dir}"> 
      <include name="*.jar"/> 
    </fileset> 
    </copy> 
    </target> 


    <target name="dist" depends="compile" 
     description="generate the distribution" > 
    <!-- Create the distribution directory --> 
    <mkdir dir="${dist}/lib"/> 

    <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --> 
    <jar jarfile="${appName.jar}" basedir="${build}"> 
    <!-- Creates a manifest file in the jar--> 
     <manifest> 
       <attribute name="Built-By" value="${user.name}" /> 
       <attribute name="Class-Path" value="./lib/mysql-connector-java-5.0.8-bin.jar"/> 
       <attribute name="Main-Class" value="com.test.bh1.bh"/> 
     </manifest> 
    </jar> 
    </target> 

    <target name="clean" 
     description="clean up" > 
    <!-- Delete the ${build} and ${dist} directory trees --> 
    <delete dir="${build}"/> 
    <delete dir="${dist}"/> 
    </target> 
</project> 
+3

您是否将mysql.jar添加到类路径中? –

+0

如果我像这样运行它'$ java -classpath ./lib/mysql-connector-java-5.0.8-bin.jar -jar dist/lib/MyProject.jar',它仍然会以异常 –

+0

退出处理代码,把e.printstacktrace()而不是getMessage()。它不会解决任何问题,但您可能会有其他原因的信息。 – Cygnusx1

回答

2

这样做:

<attribute name="Class-Path" value="./lib/mysql-connector-java-5.0.8-bin.jar"/> 

说,mysql-connector-java-5.0.8-bin.jar需求是在一个lib文件夹旁边的appName.jar。不在里面。尝试将你的lib文件夹放在你的appName.jar旁边的mysql jar中,然后运行应用程序应该确认这是问题所在。

+0

''lib/mysql-connector-java-5.0.8-bin.jar'实际上确实存在于app jar旁边,这要归功于在javac之后定义的ant“copy”操作build.xml的一部分 –

+1

@Brad - 您的构建文件将MySQL jar复制到build/lib,但是您在dist/lib中运行MyProject.jar。当你这样做时,给定你的清单类路径,java会期望MySQL.jar位于dist/lib/lib中 - 即在相对于'running'MyProject jar的lib下。 –

+0

你说得对。我将mysql.jar复制到dist/lib/lib并且它工作正常!谢谢! –

0

尝试

java -cp lib -jar dist/lib/MyProject.jar 
+0

同样的结果...'$ java -cp lib -jar dist/lib/MyProject.jar 加载Mysql JDBC驱动程序... 实例化mysql jdbc驱动程序时出错。 E = com.mysql.jdbc.Driver' –

相关问题