2014-02-13 2 views
0

소스 코드를 컴파일하는 javac 명령이 포함 된 Java 프로젝트 용 Apache Ant 빌드 파일이 있습니다. 이 프로젝트는 몇 가지 특별한 제약이 있으며 작은 하위 프로젝트로 구성됩니다. 이러한 하위 프로젝트의 대부분은 다음 폴더 구조를 가지고 있습니다.Ant javac 소스 디렉토리가 작동하지 않습니다.

/docroot 
----/WEB-INF 
--------/lib 
--------/src 
-----------A.java 
----------- ... (more java classes) 
--------/service 
-----------B.java 
----------- ... (more java classes) 

src와 service는 모두 원본 폴더입니다. A.java는/service 폴더에있는 일부 클래스 (예 : B.java)를 가져옵니다. 이클립스에서 모든 것이 잘 작동하면 A.java는 오류나 문제없이 B.java를 가져 오므로 classpath가 맞다고 가정합니다. 나는 그가 그 말을 나에게 오류를 제공 A.java를 컴파일하려고 개미에서 javac의 명령을 실행하면 :

내 javac의 명령에 내가하고 있어요을 상징 B.java

을 찾을 수 없습니다 단일 소스 디렉토리 = docroot/WEB-INF/src. docroot/WEB-INF/service도 소스 디렉토리로 설정하면 작동합니다. 그러나이 솔루션의 문제점은 다음과 같습니다. 일부 하위 프로젝트에는 단일 원본 폴더 인 "docroot/WEB-INF/src"만 있습니다. 즉, 하나의 소스 디렉토리 "docroot/WEB-INF/src"가있는 프로젝트에 대해 javac 명령에 대해 두 개의 소스 디렉토리를 설정하면 하위 프로젝트에 "docroot/WEB"폴더가 없다는 오류가 발생합니다 -INF/service "를 입력하십시오.

이 문제를 어떻게 해결할 수 있습니까?

<antcall target="compile-java"> 
    <param name="javac.classpathref" value="plugin.classpath" /> 
    <param name="javac.destdir" value="docroot/WEB-INF/classes" /> 
    <param name="javac.srcdir" value="docroot/WEB-INF/src" /> 
    <reference refid="plugin-lib.classpath" torefid="plugin-lib.classpath" /> 
</antcall> 

<target name="compile-java"> 
    <javac 
     classpathref="${javac.classpathref}" 
     compiler="${javac.compiler}" 
     debug="${javac.debug}" 
     deprecation="${javac.deprecation}" 
     destdir="${javac.destdir}" 
     fork="${javac.fork}" 
     includeAntRuntime="false" 
     memoryMaximumSize="${javac.memoryMaximumSize}" 
     nowarn="${javac.nowarn}" 
     encoding="${javac.encoding}" 
    >  
     <src path="${javac.srcdir}"/> 
    </javac> 

    <copy todir="${javac.destdir}"> 
     <fileset dir="${javac.srcdir}" excludes="**/*.java" /> 
    </copy>  
</target> 
+1

'build.xml' 파일을 게시하십시오. – hmjd

+1

나는 여기서 무엇을하고 있는지 전혀 모르지만, 절대 확실하게 말할 수있는 한 가지는 소스 파일을 WEB-INF 폴더에 넣지 않는다는 것입니다. 이 디렉토리는 deployable (/ lib의 jar 파일,/class의 클래스 파일, WEB-INF 자체의 구성 파일) 용입니다. – Gimby

+0

@hmjd 빌드 파일에서 특정 대상을 원하십니까? 내 빌드 파일에는 수백 개의 행이 있기 때문입니다. 그리고 전체 Ant 프로세스는 다른 빌드 파일로 구성됩니다. –

답변

0
<src path="${javac.srcdir}"/> 

${javac.srcdir}경로 (결장 또는 플랫폼에 따라 세미콜론으로 구분)보다는 하나의 디렉토리로 해석 것을 의미한다. 따라서 여기에 하나 이상의 디렉토리를 제공 할 수 있습니다.

<path id="module.srcdir.path"> 
    <pathelement location="docroot/WEB-INF/src" /> 
    <pathelement location="docroot/WEB-INF/services" /> 
</path> 
<property name="module.srcdir" refid="module.srcdir.path" /> 

<antcall target="compile-java"> 
    <param name="javac.classpathref" value="plugin.classpath" /> 
    <param name="javac.destdir" value="docroot/WEB-INF/classes" /> 
    <param name="javac.srcdir" value="${module.srcdir}" /> 
    <reference refid="plugin-lib.classpath" torefid="plugin-lib.classpath" /> 
</antcall> 
+0

미리 답변 해 주셔서 감사합니다. 나는 이것을 할 수 있음을 알고있다. 또는 :로 구분 된 경로를 지정하는 것은 path1 : path2와 같다.하지만 그렇게한다면 2 개의 소스 디렉토리가없는 하위 프로젝트를 컴파일 할 때 ant는 디렉토리 중 하나가 존재하지 않는다는 오류를 던집니다. –

+0

@PauloRodrigues 미안하지만, 나는 이것을'compile-java'가 일반 타겟으로,'antcall'가이 특정 하위 모듈에 속하는 것으로 이해했습니다. –

0

지금은 해결책을 찾았습니다. 컴파일 할 두 개의 소스 디렉토리가 필요한 각 하위 프로젝트에 대해 구분 된 빌드 파일을 만들었습니다. 그것에서는 각 특정 케이스에 필요한 소스 디렉토리를 설정하는 javac 명령을 덮어 씁니다. 이 방법으로 "일반"javac 명령은 여전히 ​​하나의 소스 디렉토리 만 필요로하는 하위 프로젝트와 호환되도록 단일 소스로 실행됩니다.

관련 문제