我在Ant中遇到一个问题,该问题一直困扰着我,而且我似乎没有找到解决方案。我在Java中有一个RMI项目,该项目已完成,并且and文件如下:
<project name="StockageRMI" default="compile">
<target name="compile">
<javac destdir="classes">
<src path="src/db/"/>
<classpath>
<fileset dir="lib/">
<include name="**/*.jar" />
</fileset>
<fileset dir="classes/">
<include name="**/*.class" />
</fileset>
</classpath>
</javac>
<javac destdir="classes">
<src path="src/stockage"/>
<classpath>
<fileset dir="lib/">
<include name="**/*.jar" />
</fileset>
<fileset dir="classes/">
<include name="**/*.class" />
</fileset>
</classpath>
</javac>
<javac destdir="classes">
<src path="src/server"/>
<classpath>
<fileset dir="lib/">
<include name="**/*.jar" />
</fileset>
<fileset dir="classes/">
<include name="**/*.class" />
</fileset>
</classpath>
</javac>
<javac destdir="classes">
<src path="src/client"/>
<classpath>
<fileset dir="lib/">
<include name="**/*.jar" />
</fileset>
<fileset dir="classes/">
<include name="**/*.class" />
</fileset>
</classpath>
</javac>
</target>
<target name="rmic" depends="compile">
<rmic classname="stockage.StockageImpl" base="classes/">
<classpath>
<fileset dir="lib/">
<include name="**/*.jar" />
</fileset>
<fileset dir="classes/">
<include name="**/*.class" />
</fileset>
</classpath>
</rmic>
</target>
<target name="runServer" depends="rmic,runStockage">
<java classname="server.ServerImpl" fork="true" failonerror="true" >
<classpath>
<fileset dir="lib/">
<include name="**/*.jar" />
</fileset>
<fileset dir="classes/">
<include name="**/*.class" />
</fileset>
</classpath>
</java>
</target>
<target name="runStockage">
<java classname="stockage.StockageImpl" fork="true" failonerror="true" >
<classpath>
<fileset dir="lib/">
<include name="**/*.jar" />
</fileset>
<fileset dir="classes/">
<include name="**/*.class" />
</fileset>
</classpath>
</java>
</target>
</project>
目标“编译”和“ rmic”工作正常,问题是当我尝试运行“ runStockage”时。出现错误:
Exception in thread "main" java.lang.NoClassDefFoundError: stockage/StockageImpl
[java] Caused by: java.lang.ClassNotFoundException: stockage.StockageImpl
[java] at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
[java] at java.security.AccessController.doPrivileged(Native Method)
[java] at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
[java] at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
[java] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
[java] at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
[java] Java Result: 1
这很奇怪,因为如果我尝试在终端中执行此操作,则java命令可以正常工作,并且它与javac具有相同的类路径,因为它具有相同的依赖项:
javac -cp lib/mongo-java-driver-2.11.1.jar:lib/rmiio-2-1.0.0.jar:lib/commons-logging-1.1.3.jar:classes -d classes src/stockage/StockageImpl.java
rmic -classpath lib/mongo-java-driver-2.11.1.jar:lib/rmiio-2-1.0.0.jar:lib/commons-logging-1.1.3.jar:classes -d classes stockage.StockageImpl
java -classpath lib/mongo-java-driver-2.11.1.jar:lib/rmiio-2-1.0.0.jar:lib/commons-logging-1.1.3.jar:classes server.ServerImpl
以上所有三个命令都可以正常工作,问题出在蚂蚁身上。如您所见,javac,java和rmic使用相同的依赖项和jar文件,因此我在Ant中做了同样的事情,但它不起作用。我敢肯定这是一个愚蠢的事情,但是我似乎无法在过去的6个小时中弄清楚。有人知道了吗?
最佳答案
我认为问题可能出在您的来源路径上;请尝试查看您的classes
文件夹,看看是否有一个包含stockage
文件的StockageImpl.class
文件夹。
我认为您可能希望将编译目标的源路径更改为src
而不是src/stockage
(这也将使您可以将一个<compile>
任务而不是两个),或者如果您出于某种原因仍然想要将它们分开,例如您只需要编译stockage
和db
中的文件,而不需要编译其他文件,则应分别将destdir
更改为classes/stockage
和classes/db
。