开发者

ant built version of application fails to find dependent jar

Trying to build a java application I am able to run the application successfully through Eclipse but I'm unable to run the jar file built by ant. I suspect my build.xml is to blame, I'm trying to get it right. Need help!

The mysql driver .jar file is in the lib/ directory in the project.

error:

$ 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>


Doing this:

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

Says that the mysql-connector-java-5.0.8-bin.jar needs to be in a lib folder next to your appName.jar. Not inside of it. Try putting your lib folder with the mysql jar next to your appName.jar and running the application should confirm that this is the problem.


Try

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜