2013-05-07 2 views
3

세미 콜론으로 구분 된 디렉토리 목록을 포함하는 ant 속성 $ {src.dirs}가 있습니다. 이제 fileset (replaceregexp 용)을 지정해야하며 해당 파일 세트는 $ {src.dirs}에 나열된 모든 dir의 모든 java 파일을 포함해야합니다. 어떻게 할 수 있습니까? (나는 어떤 개미 펑키 물건을 사용하지 않습니다. 나는 보통 바닐라 개미를 사용합니다). 속성의 세미콜론으로 구분 된 목록에서 파일 세트 만들기

src.dirs

이 양식이 있습니다 propertyregex를 사용하는 방법에 /usr/work/dir1/src;/usr/work/java/dir2/src;/usr/libabc/src There's is an example을,하지만 난 그것을 사용하려고하면이 오류 얻을 : build.xml:98: Problem: failed to create task or type propertyregex

편집 : 여기 내 최종 솔루션 뭔지 :

<loadresource property="source.dir.javafiles"> 
    <propertyresource name="source.dir"/> 
    <filterchain> 
    <tokenfilter> 
     <replaceregex pattern="\s*([;,]\s*)*$" replace="/**/*.java"/> 
     <replaceregex pattern="\s*([;,]\s*)+" replace="/**/*.java," flags="g"/> 
    </tokenfilter> 
    </filterchain> 
</loadresource> 

<fileset dir="" includes="${source.dir.javafiles}"/> 

이러한 정규식은 후미 쉼표 나 세미콜론이 잘못된 fileselectors를 생성하지 않도록합니다.

+0

디렉토리에 공통적 인 상위 항목이 있습니까? 파일 세트를 작성하는 데 필요합니다. –

+0

@martinclayton 질문이 명확 해졌습니다 – Pavel

+0

@martinclayton은 dir = ""이 아닌 것으로 간주 될 수 있습니까? :) 다음에 includes = "..."는 집합에 포함될 dir과 파일을 지정합니다. – Pavel

답변

2

ant-contrib를 사용하지 않고이 작업을 수행 할 수 있습니다.

<property 
    name="dirlist" 
    value="/usr/work/dir1/src;/usr/work/java/dir2/src;/usr/libabc/src" /> 

<property name="file.wildcard" value="*.java" />  
<loadresource property="dirs.include"> 
    <propertyresource name="dirlist"/> 
    <filterchain> 
    <tokenfilter> 
     <replaceregex pattern="^/" replace="" /> 
     <replaceregex pattern=";/" replace="/**/${file.wildcard}," flags="g"/> 
     <replaceregex pattern="$" replace="/**/${file.wildcard}" /> 
    </tokenfilter> 
    </filterchain> 
</loadresource> 

<fileset id="files" dir="/" includes="${dirs.include}" /> 

작업이 두 개로 나뉜다 : 여기 가능하다고 filesetincludes 속성에 사용하기에 적합한 패턴으로 세미콜론 구분하여 변환하는 제 문자열 처리; 두 번째는 패턴에서 파일 세트를 만듭니다.

여기에있는 loadresource 작업은 단순한 정규식 대체 시퀀스를 둘러싼 래퍼로 사용됩니다. 이 세 가지 대체 방법은 루트 디렉토리 \을 처리하고, 인트라 문자열 세미콜론을 Ant 패턴과 쉼표 (항목을 구분하는 데 includes 속성에 사용되는)로 확장하고 문자열 끝에 패턴을 추가합니다.

이 경우 파일 세트의 dir 속성에서 루트 디렉토리를 사용하지 않도록 조정하는 것이 좋습니다.

+0

윈도우에서,'dir = "/"'은'C :'드라이브 (또는 주 드라이브로 설정된 드라이브)에 매핑되고 다른 드라이브에있는 파일에는 실패합니다. ''로 변경하면 의도 한대로 작동합니다. –

+0

원래 질문에 해결책을 포함 시켰습니다. 나는 당신의 제안을 사용했지만, 다른 정규 표현식을 사용하여 쉼표 나 창 경로가 잘못된 fileselectors를 생성하지 않도록했습니다. – Pavel

+0

@TomHoward :''라고 생각합니다. –

2

propertyregexant-contrib입니다. 이것이 예제가 효과가없는 이유입니다.

원하는 것을 얻기위한 한 가지 방법은 다음과 같습니다.

<pathconvert property="src.dirs.includes" pathsep="/**/*.java,"> 
    <path path="${src.dirs}" /> 
</pathconvert> 
<replaceregexp match="\s+" replace=" " flags="g" byline="true"> 
    <files id="files" includes="${src.dirs.includes}/**/*.java" /> 
</replaceregexp> 

그러나 파일 이름 (경로 포함)의 공백은 사용자를 괴롭 히게됩니다.

0

당신은 단순히이 디렉토리들을 거치고 컴파일해야합니까, 아니면 의존성 때문에이 디렉토리들을 함께 컴파일해야합니까?

종속성이없는 경우 <for/> 작업을 Ant-Contrib에 시도 할 수 있습니다. 이것은 당신이 가지고있는 것과 같은 목록을 당신에게 루프를 할 수 있습니다 : 물론

<for list="${src.dirs}" 
    param="my.src.dir" 
    delimiter=";"> 
    <sequential> 
     <javac destdir="${javac.destdir}" 
      srcdir="@{my.src.dir}" 
      classpathref="main.classpath"/> 
    </sequential> 
</for> 

, 당신은 당신의 정확한 destdir을 위해 일을로 찾으면해야 할 수도 있습니다. <for/> 작업을 사용할 때 <var/> 작업을 편리하게 찾을 수 있습니다. <var/> 작업을 사용하면 변수 이름을 다시 설정할 수 있습니다. <sequential/> 작업 집합을 반복 할 때 특정 속성을 다시 설정하려는 경우가 있습니다.

그런데 Ant 1이있는 경우.8 이상을 사용하는 경우 <var/> 대신 <local/> 작업을 사용할 수 있습니다.

관련 문제