2014-10-01 48 views
1

我的项目布局:蚂蚁:指定的ClassNotFoundException当外部依赖

. 
├── bin 
│   ├── build 
│   │   └── hello.jar 
│   │── classes 
│       └── helloworld 
│       └── Main.class 
├── build.xml 
├── lib 
│   └── postgresql.jar 
└── src 
    └── helloworld 
     └── Main.java 

的build.xml

<project> 
<property name="class_dir" value="bin/classes"/> 
<property name="src_dir" value="src"/> 
<property name="build_dir" value="bin/build"/> 
<property name="jar_name" value="hello.jar"/> 
<property name="lib_dir" value="lib"/> 

<target name="clean"> 
    <delete dir="${class_dir}"/> 
    <delete dir="${build_dir}"/> 
</target> 

<target name="compile"> 
    <mkdir dir="${class_dir}"/> 
    <javac includeantruntime="false" srcdir="${src_dir}" destdir="${class_dir}"/> 
</target> 

<target name="jar"> 
    <mkdir dir="${build_dir}"/> 
    <jar destfile="${build_dir}/${jar_name}" basedir="${class_dir}"> 
     <manifest> 
      <attribute name="Main-Class" value="helloworld.Main"/> 
     </manifest> 
    </jar> 
</target> 

<target name="run" > 
    <java jar="${build_dir}/${jar_name}" fork="true" failonerror="true"> 
     <classpath> 
      <pathelement location="${lib_dir}/postgresql.jar"/> 
     </classpath> 
    </java> 
</target> 

错误执行时ant run

run: 
[java] java.lang.ClassNotFoundException: org.postgresql.Driver 
[java]  at java.net.URLClassLoader$1.run(URLClassLoader.java:372) 
[java]  at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
[java]  at java.security.AccessController.doPrivileged(Native Method) 
[java]  at java.net.URLClassLoader.findClass(URLClassLoader.java:360) 
[java]  at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
[java]  at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
[java]  at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
[java]  at java.lang.Class.forName0(Native Method) 
[java]  at java.lang.Class.forName(Class.java:259) 
[java]  at helloworld.Main.main(Unknown Source) 
[java] Exception in thread "main" java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5430/hello_world 
[java]  at java.sql.DriverManager.getConnection(DriverManager.java:689) 
[java]  at java.sql.DriverManager.getConnection(DriverManager.java:247) 
[java]  at helloworld.Main.main(Unknown Source) 

当执行jar文件时,甚至可以指定类似这样的类路径吗? (我不得不附和类路径,它看起来很好。)

编辑:

http://www.coderanch.com/t/108841/tools/Ant-Compile-time-runtime-classpath我想要实现是不可能的。

+0

此程序在Ant之外运行良好吗? – tjg184 2014-10-01 16:26:33

+0

如果我使用'-cp CLASSPATH'选项,只要它不是打包成jar,即'java -cp CLASSPATH -jar myjar.jar'不起作用。 – ben 2014-10-01 16:29:03

+0

它看起来像您的classpath xml元素可能不在java标记中。 – tjg184 2014-10-01 16:31:43

回答

0

为什么不尝试构建类路径作为然后通过引用传递给java执行?在“运行”目标内部执行下面的操作:

<path id="runtime.classpath"> 
    <fileset dir="${lib_dir}"> 
    <include name="*.jar"/> 
    </fileset> 
    <fileset dir="${build_dir}"> 
    <include name="*.jar"/> 
    </fileset> 
</path> 
<pathconvert property="classpathForPrinting" refid="runtime.classpath"/> 
<echo>Classpath is ${classpathForPrinting}</echo> 
<java fork="true" failonerror="true" classname="helloworld.Main"> 
    <classpath refid="runtime.classpath"/> 
</java> 
+0

我目前正在使用类似的方法。不过,我的初衷是在java任务中指定一个jar文件。 – ben 2014-10-03 21:02:36