2010-02-05 6 views
15

ANT WAR 태스크를 사용하여 기존 WAR 파일 내의 파일을 업데이트하려고합니다. WAR의 폴더에있는 xml 파일 세트를 내 HDD의 새 파일 세트로 바꿔야합니다.기존 WAR 파일 내의 파일 업데이트

<war destfile="myApp.war" update="true" > 
    <zipfileset dir="<PathToStubsFolderOnHDD>" includes="**/*.xml" prefix="<PathToStubsFolderInWAR>"/> 
</war> 

원본 WAR에 동일한 이름의 xml이 없으면 정상적으로 작동합니다. 그러나 원래 WAR에 같은 이름의 xml이 포함 된 경우; WAR 태스크는 HDD의 파일로 업데이트하지 않습니다.

개미 WAR 작업 문서를 읽

갱신 | 이미 존재하는 경우 대상 파일을 업데이트하거나 덮어 쓸지 여부를 나타냅니다. 기본값은 "false"입니다.
중복 | 중복 된 파일이 발견되면 작동합니다. 유효한 값은 "add", "preserve"및 "fail"입니다. 기본값은 "add"입니다.

내가 update = "false"를 사용하면; 원래 WAR의 다른 모든 파일은 삭제되고 새로운 xml 만 저장됩니다.

duplicate = "add"를 사용하면 효과가 없습니다.

이 방법에 대한 제안 사항은 무엇입니까 ??

답변

11

옵션이 update=true 인 경우 전쟁 파일은 업데이트하려는 파일보다 최신 것으로 나타납니다. Someone 문제를 해결하려면 touch 작업을 '0'과 함께 적용하는 것이 좋습니다.

zip 작업은 기존 zip에 추가하려는 원본 파일이 zip보다 최신인지를 확인합니다. 해결 방법은 추가하기 전에 zip 파일 <touch millis="0" />입니다.

아니면 reverse stuff 할 수있는하십시오 touch XML 파일에 war 작업 (들)하게 전에 작업을 수행

합니다.

0

아마 가장 쉬운 방법은 전쟁을 임시 디렉토리로 폭발시키고 변경 한 다음 전쟁을 재건하는 것입니다. 인정하지 않아.

9

감사합니다. Aito! 이것은 (.WAR) 파일 압축에 기존 파일을 대체 할 내 솔루션은

<target name = "UpdateWARWithStubs" 
    description="Updates WAR file with files from Stub folder"> 

    <!-- Use touch to set modification time of all stubs to current time. This will force war task to update stub files inside the war --> 
    <tstamp> <format property="touch.time" pattern="MM/dd/yyyy hh:mm aa"/> </tstamp> 
    <touch datetime="${touch.time}"> 
     <fileset dir="${path.to.stubs.on.hdd}" /> 
    </touch> 

    <war destfile="myApp.war" update="true"> 
     <zipfileset dir="${path.to.stubs.on.hdd}" prefix="${path.to.stubs.in.war}"/> 
    </war> 
</target> 
+0

같은 것을 할 수 있습니다 정의 업데이트 될 전쟁 파일의 전쟁 경로 : 임시 파일로 war 파일을 재 포장과 같은 원래의 전쟁 파일을 덮어 쓰기까지 종료 위의 예에서? – ziggy

+0

destfile = "path/for/war/myApp.war"로 경로를 하드 코딩하거나 속성 $ {path.for.war}/$ {file.name.war}에서 값을 더 잘 읽을 수 있습니다. –

+0

비슷한 일을하십시오. < "/>' – yellavon

0

입니다 :

여기에 전체 ANT 스크립트입니다. 초기 상태는 Tomcat6 서버용 mywebapp.war을 컴파일하고 패키지화하는 build.xml이 있습니다. Tomcat7 서버에는 war 파일 내의 사소한 구성 변경이 필요합니다.

  • 프로젝트 하위 폴더 web 및 webT7은 CVS 제어 폴더이므로 아무 이유없이 타임 스탬프를 터치하고 싶지 않습니다. 다음 트릭이 그 일을합니다.
  • 웹/WEB-INF/lib/mywebapp를 컴파일하고 만듭니다.보통
  • 대상 "전쟁"과 같은 jar 파일 내가 수정해야
  • 는 META-INF/context.xml에와 WEB-INF/web.xml의 것들로 webT7 하위 폴더에 몇 가지 특정 파일이 웹 폴더에서 tomcat6 아카이브를 만듭니다 각 바람둥이 버전에 대한 비트.
  • mywebapp.war.zip 파일의 복사본을 만듭니다.
  • webT7 하위 폴더에서 새 빌드 임시 폴더로 파일을 복사하려면 preservelastmodified 특성을 사용하지 마십시오. 이렇게하면 각 파일에 대해 새로운 타임 스탬프가 제공되므로 별도의 터치 명령없이 터치됩니다.
  • 과거의 타임 스탬프를 넣을 수있는 안전 장치가있는 새로운 지퍼입니다. 이렇게하면 지퍼 업데이트가 제대로 작동합니다.
  • mywebapp.war_T7.zip 컨텐츠를 업데이트하는 zip 태스크를 사용하면 원래의 타임 스탬프를 보존하지 않고 기존 파일을 복사했기 때문에 기존 파일을 대체해야합니다.

이유 WebT7 컨텐츠를 임시 빌드 폴더에 복사하는 것은 컨텐츠 관리 시스템입니다. 이유없이 원본 저장소 파일의 타임 스탬프를 변경하고 싶지 않습니다. 컴파일, 항아리, 전쟁 목표는 Tomcat이 사용하는 대상과 상관없이 항상 동일합니다.

이전에 말한 것처럼 zip update = "true"속성은 파일을 대체하지 않고 zip이 우리가 제공 한 것보다 오래된 파일을 가지고있는 경우에만 업데이트합니다. 웹/config.jsp (2013-01-21 14:01:01) 및 webT7/config.jsp (2012-12-21 15:02:03) 파일이 있으면이 문제가 발생할 수 있습니다. 파일이 대체되지 않았습니다. build.xml 파일에서

니펫

<target name="war" depends="compile,jar" description="Create a .war file"> 
    <delete file="${name}.war.zip" /> 
    <zip destfile="${name}.war.zip" 
     basedir="./web/" 
     excludes=" 
      **/CVS* 
      " 
    /> 
</target> 

<target name="warT7" depends="war" description="Create a .war file for Tomcat7"> 
    <delete dir="${build}" /> 
    <mkdir dir="${build}" /> 

    <delete file="${name}.war_T7.zip" /> 
    <copy file="${name}.war.zip" 
     tofile="${name}.war_T7.zip" overwrite="true" preservelastmodified="true" 
    />  

    <copy todir="${build}" overwrite="true"> 
     <fileset dir="./webT7" /> 
    </copy> 

    <touch datetime="01/31/1981 01:00:00 AM" file="${name}.war_T7.zip" /> 
    <zip destfile="${name}.war_T7.zip" update="true"> 
     <zipfileset dir="${build}" prefix="" /> 
    </zip> 
    <delete dir="${build}" /> 
</target> 
0

어느 쪽도 터치 옵션은 나를 위해 일하지 않는다. 개미 스크립트 내에서 메이븐 인공물에 의해 만들어진 원래의 war 파일은 이것과 관련이있을 수 있습니다.

<target name="update-properties"> 
    <war destfile="target/${war.name}temp" needxmlfile='false'> 
     <zipfileset src="target/${war.name}" includes="**/*" 
         excludes="${path.to.properties.in.war}" /> 
     <zipfileset file="${path.to.new.properties}" 
         fullpath="${path.to.properties.in.war}" /> 
    </war> 
    <move file="target/${local.war.name}temp" tofile="target/${local.war.name}"/> 
    <delete file="target/${local.war.name}temp"/> 
</target> 

${path.to.properties.in.war} "WEB-INF/classes/META-INF/spring/database.properties"