2010-02-05 28 views
15

Tôi đang cố cập nhật tệp bên trong tệp WAR hiện có bằng cách sử dụng tác vụ ANT WAR. Tôi cần phải thay thế một tập hợp các tệp xml trong một thư mục trong WAR bằng các tệp mới từ ổ cứng của tôi.Cập nhật các tệp bên trong tệp WAR hiện có

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

Điều này làm việc tốt nếu WAR ban đầu không có xml cùng tên. Tuy nhiên, nếu WAR ban đầu chứa xmls có cùng tên; Nhiệm vụ WAR không cập nhật chúng với các tệp từ HDD.

Các ANT WAR tài liệu hướng dẫn nhiệm vụ đọc:

cập nhật | cho biết có cập nhật hay ghi đè tệp đích nếu nó đã tồn tại hay không. Mặc định là "sai".
trùng lặp | hành vi khi tìm thấy một tệp trùng lặp. Các giá trị hợp lệ là "thêm", "bảo toàn" và "không thành công". Giá trị mặc định là "thêm".

nếu tôi sử dụng update = "false"; tất cả các tệp khác trong WAR ban đầu sẽ bị xóa và chỉ các tệp xml mới được lưu trữ.

sử dụng duplicate = "add" didnot cũng không có tác dụng.

Bất kỳ đề xuất nào về cách thức này có thể đạt được ??

Trả lời

11

Dường như với tùy chọn update=true, tệp chiến tranh mới hơn tệp bạn muốn cập nhật. Someone đề xuất áp dụng tác vụ touch với '0' để khắc phục sự cố.

Tác vụ zip chỉ kiểm tra nếu các tệp nguồn bạn muốn thêm vào zip hiện có gần đây hơn mã zip. Giải pháp thay thế sẽ là <touch millis="0" /> tệp zip trước khi thêm.

Hoặc bạn có thể làm reverse stuff:

Thực hiện touch trước war nhiệm vụ trên tập tin XML (s) làm cho nó làm việc.

0

Có lẽ cách dễ nhất là phát nổ chiến tranh đến thư mục tạm thời, thực hiện thay đổi và sau đó xây dựng lại chiến tranh. Không tốt đẹp, phải thừa nhận.

9

Cảm ơn Aito!

Đây là kịch bản hoàn chỉnh ANT:

<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

đâu là con đường chiến tranh đến tập tin chiến tranh phải được cập nhật định nghĩa trong ví dụ trên? – ziggy

+0

Bạn chỉ có thể mã hóa đường dẫn như destfile = "path/for/war/myApp.war" hoặc đọc tốt hơn giá trị từ thuộc tính $ {path.for.war}/$ {file.name.war} –

+0

Tôi đang cố gắng làm một cái gì đó tương tự. ' ' yellavon

0

Đây là giải pháp của tôi để thay thế các file hiện có trong zip (.WAR) tập tin. Trạng thái ban đầu là tôi có tệp build.xml để biên dịch và đóng gói mywebapp.war cho máy chủ Tomcat6. Thay đổi cấu hình nhỏ trong tệp chiến tranh là bắt buộc đối với máy chủ Tomcat7.

  • thư mục con dự án web và webT7 là các thư mục được kiểm soát CVS, Tôi không muốn chạm vào dấu thời gian không có lý do. Bí quyết sau đây thực hiện công việc.
  • biên dịch và tạo web/WEB-INF/lib/mywebapp.tệp jar như thường lệ
  • mục tiêu "chiến tranh" tạo lưu trữ tomcat6 từ thư mục web
  • có một vài tệp cụ thể trong thư mục con webT7 như META-INF/context.xml và WEB-INF/web.xml mà tôi phải sửa đổi bit cho mỗi phiên bản tomcat.
  • tạo bản sao của tệp mywebapp.war.zip
  • sao chép tệp từ thư mục con webT7 vào thư mục tạm thời xây dựng mới, không sử dụng thuộc tính preservelastmodified !!! Điều này cung cấp một dấu thời gian mới cho mỗi tệp, do đó, chạm của nó mà không có lệnh chạm riêng biệt.
  • không an toàn chạm vào mã zip mới để đặt dấu thời gian trước, điều này đảm bảo cập nhật zip hoạt động bình thường.
  • sử dụng tác vụ zip để cập nhật nội dung mywebapp.war_T7.zip, nó sẽ thay thế các tệp hiện có vì chúng tôi đã sao chép chúng mà không giữ lại dấu thời gian ban đầu.

Lý do tôi sao chép nội dung webT7 vào thư mục xây dựng tạm thời là hệ thống quản lý nội dung. Tôi không muốn thay đổi dấu thời gian của các tệp kho gốc mà không có lý do gì. Mọi thứ khác biên dịch, jar, mục tiêu chiến tranh luôn giống nhau bất kể mục tiêu Tomcat tôi sử dụng là gì.

Thuộc tính cập nhật Zip = "true" như đã nói trước đó không thay thế tệp, nó chỉ cập nhật nếu tệp zip có tệp cũ hơn tệp chúng tôi cung cấp. Điều này có thể gây ra sự cố nếu tôi có tệp web/config.jsp (2013-01-21 14:01:01) và webT7/config.jsp (2012-12-21 15:02:03). Tệp không được thay thế.

Snippet từ file 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

Cả tùy chọn liên lạc làm việc cho tôi. Tệp chiến tranh gốc được tạo bởi một tạo phẩm maven từ bên trong kịch bản kiến ​​có thể có liên quan đến điều này. Đã kết thúc đóng gói lại các tập tin chiến tranh vào một tập tin tạm thời và ghi đè lên tập tin chiến tranh ban đầu như thế này:

<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> 

nơi ${path.to.properties.in.war} có thể được cái gì đó như "WEB-INF/classes/META-INF/spring/database.properties"

Các vấn đề liên quan