2017-05-22 16 views
1

을 찾을 수 없습니다. 그 중에서도 두 가지 클래스 인 TheProblem과 Server가 있습니다.ANT - Java ClassLoader는 내 프로젝트에서 클래스

public class TheProblem { 
    public static void main (String args []) throws ClassNotFoundException { 
     ClassLoader.getSystemClassLoader().loadClass("Server"); 
    } 
} 

명령 줄에서 코드를 실행하면 모든 것이 올바르게 동작합니다. 하지만 ANT를 사용하여 코드를 실행하면 ClassNotFoundException이 발생합니다. Server.class와 TheProblem.class는 모두 같은 디렉토리에 있지만.

내 프로젝트의 디렉토리 구조는 매우 간단하다 - 난 여기가 설명하기 위해 노력할 것입니다 : 나는 실행

<?xml version="1.0" encoding="UTF-8" ?> 

<project name="JAXB" default="compile"> 

<path id="project.class.path"> 
    <pathelement path="${java.class.path}" /> 
    <pathelement location="build" /> 
</path> 

<target name="init" > 
    <mkdir dir="build" /> 
</target> 

<target name="compile" depends="init" > 
    <javac classpathref="project.class.path" srcdir="src" destdir="build" 
     includeAntRuntime="false" /> 
</target> 

<target name="execute-problem" depends="compile"> 
    <java classpathref="project.class.path" classname="TheProblem" /> 
</target> 

<target name="clean" depends="init"> 
    <delete dir="build" /> 
</target> 
</project> 

: 여기

root_folder/ 
- build.xml 
- src/ 
    - TheProblem.java 
    - Server.java 
- build/ 
    - TheProblem.class 
    - Server.class 

내 build.xml 파일의 발췌 한 것입니다 개 컴파일 모든 것이 컴파일되지만 개 실행 문제 인을 실행하면 ClassLoader는 Server 클래스를 찾을 수 없으며 ClassNotFoundException을 발생시킵니다. 빌드 디렉토리로 이동하여 java TheProblem을 호출하면 올바르게 작동합니다. 나는 정말로 단서가 없다. 왜 ANT를 사용하지 않는지.

이 게시물을 읽는 데 시간을내어 주셔서 감사합니다. 대신

<target name="execute-problem" depends="compile"> 
     <java classpathref="project.class.path" classname="TheProblem" /> 
    </target> 

시도의

+0

를 사용하여 패키지를 사용할 수 있습니다. 클래스 로딩은 훨씬 쉽고 안정적입니다. –

+0

여전히 작동하지 않습니다. 모든 클래스를 "기본"패키지에 넣고 동일한 예외를 계속 가져옵니다. - 그러나 명령 행에서 프로그램을 실행해도 여전히 작동합니다. –

답변

1

<target name="execute-problem" depends="compile"> 
    <java fork="true" dir="." classname="TheProblem"> 
    <classpath> 
     <path refid="project.class.path" /> 
    </classpath> 
    </java> 
</target> 
+0

작업에 fork = "true"속성을 추가 할 수도 있습니다. 그렇지 않으면 Ant JVM 컨텍스트 내에서 코드를 실행하게됩니다. 어떤 문제도 발생하지 않을 수도 있지만 일반적으로 물건을 격리 된 상태로 유지하는 것이 더 안전하거나 덜 놀라운 것입니다. – David

+0

오른쪽에

+0

대단히 감사합니다. fork = "true"가 문제를 해결했습니다. –