2011-10-15 2 views
3

Javac 작업으로 컴파일 할 파일을 정확하게 나타내려면 FileSet을 사용하고 싶습니다. 나는 함축적 인 행동을 원하지 않는다. 그러나 이것에 대한 나의 시도는 실패했다. 여기에 내가 지금까지 무엇을 가지고 있습니다 :Ant : javac 작업에서 파일 세트 사용

내 모든 소스 파일을 포함하는 FileSet.

<fileset id="srcfiles" dir="${srcdir}"> 
    <include name="**/*.java"/> 
</fileset> 

그리고 대상을 javac으로 전달하려고합니다. 이 날이 오류주는

<target name="build"> 
    <javac srcdir="."> 
     <fileset refid="srcfiles"/> 
    </javac> 
</target> 

: 개미 문서를 읽고 나면 javac doesn't support the nested "fileset" element.

, 나는 fileset에서 sourcepath로 가장 안쪽 태그를 변경했습니다. 이것은 파일이 컴파일되었다는 의미에서 작동했지만 여전히 오류가 발생했습니다 : srcfiles doesn't denote a path. 소스는 암묵적인 규칙으로 인해 컴파일 된 것뿐입니다.

컴파일 할 개별 파일을 명시 적으로 javac에 알릴 수 있습니까? 또는 단순히 Ant가 어떻게 작동해야하는지가 아닌가? 소스 파일을 식별하는 것이 빌드 프로세스의 중요한 부분 인 C++ 배경에서 왔습니다. 그러나 Java의 파일 이름 지정 및 디렉토리 구조 요구 사항을 고려할 때 암시 적으로 **/*.java 패턴 규칙이 모든 사용 사례를 다룹니다.

답변

4

ant manual for javac는 말한다 :

If you wish to compile only files explicitly specified and disable javac's default searching mechanism then you can unset the sourcepath attribute:

<javac sourcepath="" srcdir="${src}" 
     destdir="${build}" > 
    <include name="**/*.java"/> 
    <exclude name="**/Example.java"/> 
</javac> 

가 나는 그것이 비록 좋은 아이디어라고 생각하지 않습니다. 잘 설계된 프로젝트에서는 주어진 디렉토리 (또는 디렉토리 세트)의 모든 파일을 컴파일해야합니다. 컴파일해서는 안되는 파일은 전혀 존재하지 않아야하며, 별도의 디렉토리에 있어야합니다.

1

넌 무엇을 원하니? 모든 * .java 코드를 단일 디렉토리에서 컴파일 하시겠습니까? 또는 하나의 파일 만 컴파일 하시겠습니까?

모든 자바 소스 코드를 컴파일 하시겠습니까? 그런 다음 소스 코드 파일의 위치를 ​​정의한 다음 빌드 디렉토리의 위치를 ​​정의해야합니다. 이 빌드 디렉토리는 자바 코드를 컴파일 한 후에 * .class 파일을위한 것이다.

쉬운 방법은 먼저 등 소스 코드 디렉토리, 빌드 디렉토리는,이 빌드의 간단한 예이고, 정의 할 수있는이 파일에서 build.properties 하나 개 파일을 작성해야한다. 당신의 의 build.xml 파일의 속성 파일 다음

# Source Code Properties --------------------------- 
project.dir=. 
src.dir=${folder.project}/src 
dist.dir=${folder.project}/dist 
build.dir=${folder.project}/build 
test.dir=${folder.project}/testing 

그리고, 당신은 다음과 같은 자바 코드를 컴파일 할 수

<!-- define build.properties file --> 
<property file="build.properties" /> 

<target name="compile" description="Compile all java code from src dir"> 
    <javac srcdir="${src.dir}" 
      destdir="${build.dir}" 
    /> 
</target> 

이 개미 작업으로 src 디렉토리에있는 모든 Java 코드를 디렉토리에 컴파일 할 수 있습니다.

+0

현재, 예, 특정 디렉토리에서 모든 * .java 파일을 컴파일 중입니다. 나는 변화가 생길 때를 대비하여 일반적인 해결책을 원한다. 그러나, 내가 그것에 대해 생각할수록 Java 프로젝트에서 변경 될 것이라고 확신하지는 않습니다 ... –

+0

Ussually 자바 프로젝트에서 먼저 프로젝트의 디렉토리 구조에 대해 고려해야합니다. 'standart'방식은 당신이 ** build와 src ** dir이 있어야한다는 것입니다. 다른 디렉토리는 선택 사항입니다. 쉬운 방법은 maven 디렉토리 구조에서 보겠습니다 :) – martinusadyh

+0

Java 디렉토리 구조 [표준 디렉토리 레이아웃 소개] (http : //maven.apache .org/guides/introduction/introduction-to-the-standard-directory-layout.html) – martinusadyh

1

이 경우 C/C++ 용어로 생각하는 것은 쓸모가 없습니다. C/C++에서 보통 컴파일 할 모든 파일을 나열하고 각 *.c 또는 *.cc 파일은 컴파일러의 관점에서 - 서로 독립적 인 Makefile을가집니다.

정반대 자바 마찬가지입니다 : 하나의 자바 컴파일러에 파일이 클래스 참조 뭔가 다른 을 줄 것이다 경우, 컴파일러는 그 '다른'바이너리 형태로보고 싶어.세 가지 시도 할 것이다 컴파일러 : - 그 일을 사용하는 그렇다면 이미 컴파일되어 있기 때문에

  • 가의 대상 경로에 그 '다른'인가

    • 는 클래스 경로에서 일부 라이브러리의 그 '다른'인가 컴파일러 - 이미 소스에서 컴파일되었을 수도 있습니다. 간단히 말해서
    • 소스 파일을 컴파일러의 sourcepath에서 찾을 수있는 곳입니까? 그렇다면 먼저 컴파일 한 다음 다시 실제 파일로 돌아갑니다. 태스크.

    이 조금 간단하지만, 이미 C/C++ 그냥 다른에있는 점의 대부분을 보여줍니다

    • 소스 파일에 서로 독립적이지있습니다.
    • 컴파일러는 초보자처럼 추측 할 수있는 것보다 많은 것을 컴파일하려고 할 수 있습니다.
    • 컴파일러가 .class 파일과 .java 파일 간의 매핑을 추측 할 수있는 경우에만 해당 automagic 내용이 작동합니다.
    • Java에서는 컴파일러에 대한 인수가 많지 않습니다. 이 모든 설정은 각 소스 파일에 적용됩니다. 반면에 C/C++에서는 수 킬로바이트의 define 인수, 최적화 설정 등을 가질 수 있습니다. 각 소스 파일마다 다를 수 있습니다.
    • 자바 개발자는 Java 컴파일러를 마이크로 매니지먼트하지 않으려 고합니다. 소스 디렉토리의 모든 파일을 컴파일하려고합니다.
    • 자바 개발자는 원본 파일 간의 정확한 종속 관계를 연구하고 싶지 않습니다. 컴퓨터는 이와 같은 작업에서 더 낫습니다.

    이 모든 것들이 Java의 Ant 및 Maven과 모든 알맞은 빌드 시스템에서 작동합니다. 완전한 소스 디렉토리를 컴파일하십시오. 그래서 예, 그것이 개미가 일하기를 원하는 방식입니다.

  • 관련 문제