2013-06-04 1 views
1

Ant 문제로 인해 계속 괴롭 히고 있으며 해결책을 찾지 못했습니다. 나는 완료 자바의 RMI 프로젝트를 가지고 있고, 아래 파일 :내 프로그램을 실행하려고 할 때 앤트 오류가 발생합니다.

<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 시간 동안 그것을 이해할 수없는 것처럼 보인다. 누구나 단서가 있니?

답변

1

문제는 소스 경로에있을 수 있다고 생각합니다. classes 폴더를보고 StockageImpl.class 파일이 포함 된 stockage 폴더가 있는지 확인하십시오.

src/stockage 대신 컴파일 대상의 소스 경로를 src (두 개가 아닌 <compile> 개의 작업을 가질 수도 있음)으로 변경하거나, 어떤 이유로 든 여전히 갖고 싶은 경우 그들 분리, 예 stockagedb의 파일을 컴파일하고 다른 파일은 컴파일하지 말고 destdirclasses/stockageclasses/db으로 각각 변경해야합니다.