Cách tạo tệp chiến tranh


96

Thực tiễn tốt nhất để tạo tệp chiến tranh (sử dụng eclipse) để chạy trên tomcat là gì? hướng dẫn, liên kết, ví dụ được đánh giá cao.

Câu trả lời:


98

Bạn có thể sử dụng Ant để thiết lập, biên dịch, WAR và triển khai giải pháp của mình.

<target name="default" depends="setup,compile,buildwar,deploy"></target>

Sau đó, bạn có thể thực hiện một cú nhấp chuột trong Eclipse để chạy mục tiêu Ant đó. Dưới đây là ví dụ về từng bước:

Điều kiện tiên quyết

Chúng tôi sẽ giả định rằng bạn có mã của mình được tổ chức như sau:

  • ${basedir}/src: Tệp Java, thuộc tính, tệp cấu hình XML
  • ${basedir}/web: Các tệp JSP của bạn
  • ${basedir}/web/lib: Bất kỳ JAR nào được yêu cầu trong thời gian chạy
  • ${basedir}/web/META-INF: Tệp kê khai của bạn
  • ${basedir}/web/WEB-INF: Tệp web.xml của bạn

Thiết lập

Xác định setuptác vụ tạo thư mục phân phối và sao chép bất kỳ tạo tác nào cần được WARred trực tiếp:

<target name="setup">
    <mkdir dir="dist" />
    <echo>Copying web into dist</echo>
    <copydir dest="dist/web" src="web" />
    <copydir dest="dist/web/WEB-INF/lib" src="${basedir}/../web/WEB-INF/lib" />
</target>

Biên dịch

Xây dựng các tệp Java của bạn thành các lớp và sao chép lên bất kỳ tạo tác không phải Java nào nằm trong đó srcnhưng cần có sẵn trong thời gian chạy (ví dụ: thuộc tính, tệp XML, v.v.):

<target name="compile">
    <delete dir="${dist.dir}/web/WEB-INF/classes" />
    <mkdir dir="${dist.dir}/web/WEB-INF/classes" />
    <javac destdir="${dist.dir}/web/WEB-INF/classes" srcdir="src">
        <classpath>
            <fileset dir="${basedir}/../web/WEB-INF/lib">
                  <include name="*" />
            </fileset>
        </classpath>
    </javac>
    <copy todir="${dist.dir}/web/WEB-INF/classes">
        <fileset dir="src">
            <include name="**/*.properties" />
            <include name="**/*.xml" />
        </fileset>
    </copy>
</target>

Xây dựng CHIẾN TRANH

Tự tạo CHIẾN TRANH:

<target name="buildwar">
    <war basedir="${basedir}/dist/web" destfile="My.war"
     webxml="${basedir}/dist/web/WEB-INF/web.xml">
        <exclude name="WEB-INF/**" />
        <webinf dir="${basedir}/dist/web/WEB-INF/">
            <include name="**/*.jar" />
        </webinf>
    </war>
</target>

Triển khai

Cuối cùng, bạn có thể thiết lập một nhiệm vụ để triển khai WAR trực tiếp vào vị trí triển khai Tomcat của mình:

<target name="deploy">
    <copy file="My.war" todir="${tomcat.deploydir}" />
</target>

Nhấp và đi!

Khi tất cả điều này được thiết lập, chỉ cần khởi chạy defaultmục tiêu từ Eclipse sẽ biên dịch, WAR và triển khai giải pháp của bạn.

Ưu điểm của cách tiếp cận này là nó sẽ hoạt động bên ngoài Eclipse cũng như bên trong Eclipse và có thể được sử dụng để dễ dàng chia sẻ chiến lược triển khai của bạn (ví dụ: thông qua kiểm soát nguồn) với các nhà phát triển khác cũng đang làm việc trong dự án của bạn.


tôi muốn triển khai nó cho tomcat. Tôi nên thay đổi targer như thế nào?

Bạn có thể vui lòng nói rõ hơn? Miễn là $ {tomcat.deploydir} trỏ đến thư mục triển khai ngữ cảnh Tomcat của bạn, điều đó sẽ làm được. Không?
David Citron

1
Trong mục tiêu chiến tranh, không cần thiết phải có '<lude name = "WEB-INF / **" />'. Bạn đã tạo các tệp * .class vào thư mục này và việc loại trừ chúng không hoạt động. Xóa dòng loại trừ này khỏi mục tiêu chiến tranh mà nó hoạt động.
ankitjaininfo

2
Câu trả lời này không cần thiết phải phức tạp.
Alex R

38

Tôi luôn chọn Xuất từ ​​Eclipse. Nó xây dựng tệp chiến tranh và bao gồm tất cả các tệp cần thiết. Cung cấp cho bạn việc tạo dự án dưới dạng một dự án web, đó là tất cả những gì bạn cần làm. Eclipse làm cho nó rất đơn giản để làm.


Cảm ơn! và đối với giá trị của nó, bạn chọn "Xuất" từ menu "Tệp", sau đó trong "Chọn điểm đến xuất", nhập "WAR" và tùy chọn tệp chiến tranh sẽ xuất hiện.
Brad Parks

4
lựa chọn của tôi cho các ứng dụng web nhanh và bẩn. viết một kịch bản kiến ​​chỉ để có được một cuộc kiểm tra WAR chỉ là quá nhiều công việc.
Renan

một giải pháp khác thay vì tạo tệp kiến ​​sẽ chuyển đến thư mục bạn muốn bọc trong tệp WAR và thực hiện lệnh này "jar -cvf name.war *".
MC

Cảm ơn vì điều này, đơn giản hơn rất nhiều so với việc định cấu hình Maven hoặc Ant (khi nó không cần thiết).
simon

23

Chúng tôi sử dụng Maven (anh trai của Ant) cho tất cả các dự án java của mình và nó có một plugin WAR rất tiện lợi. Hướng dẫn và cách sử dụng có thể được tìm thấy ở đó.

Nó dễ dàng hơn Ant rất nhiều, hoàn toàn tương thích với Eclipse (sử dụng maven eclipse: eclipse để tạo các dự án Eclipse) và dễ cấu hình.

Trang chủ của Maven

Plugin Maven WAR

Cấu hình mẫu:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1-alpha-2</version>
    <configuration>
        <outputDirectory>${project.build.directory}/tmp/</outputDirectory>
        <workDirectory>${project.build.directory}/tmp/war/work</workDirectory>
        <webappDirectory>${project.build.webappDirectory}</webappDirectory>
        <cacheFile>${project.build.directory}/tmp/war/work/webapp-cache.xml</cacheFile>
        <nonFilteredFileExtensions>
            <nonFilteredFileExtension>pdf</nonFilteredFileExtension>
            <nonFilteredFileExtension>png</nonFilteredFileExtension>
            <nonFilteredFileExtension>gif</nonFilteredFileExtension>
            <nonFilteredFileExtension>jsp</nonFilteredFileExtension>
        </nonFilteredFileExtensions>
        <webResources>
            <resource>
                <directory>src/main/webapp/</directory>
                <targetPath>WEB-INF</targetPath>
                <filtering>true</filtering>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </webResources>
        <warName>Application</warName>
    </configuration>
</plugin>

1
Tôi đã trả lại cho bạn điểm của bạn (mặc dù tôi không phải là người xóa nó). Maven chắc chắn là một lựa chọn hợp lý nếu bạn tình cờ (muốn?) Phù hợp với phiên bản cụ thể của họ về "quy ước về cấu hình".
David Citron

1
Tôi tình cờ thích nó =) Tôi đang làm CM cho một dự án khá lớn, và tôi đánh giá cao công việc cấu hình dự án được thực hiện cho tôi. Ngoài ra, hỗ trợ plugin rất tuyệt vời. Có thể thiết lập và chạy một dự án nhiều mô-đun với một plugin WAR, với Surefire và CheckStyle trong năm phút là một điều tuyệt vời. Ant, mặc dù cởi mở hơn và được cho là mạnh mẽ hơn, nhưng lại là một rắc rối khi so sánh. Dù sao, Maven là một tập hợp con của Ant, vì vậy nếu bạn cần thực hiện bất kỳ kịch bản nào ở đó, bạn được hoan nghênh.
mikek

4
Bên cạnh đó, cấu trúc XML của Maven dựa trên ANT và ANT được kết hợp như một tập con của Maven.
mikek

14

Tập tin chiến tranh chỉ đơn giản là một tập tin jar có phần mở rộng chiến tranh, nhưng điều khiến nó hoạt động là cách nội dung thực sự được cấu trúc.

Hướng dẫn J2EE / Java EE có thể là một khởi đầu:

http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/WebComponents3.html

Và đặc tả Servlet chứa các chi tiết đẫm máu:

http://java.sun.com/products/servlet/download.html

Nếu bạn tạo một dự án web mới trong Eclipse (tôi đang đề cập đến phiên bản Java EE), cấu trúc được tạo cho bạn và bạn cũng có thể cho nó biết nơi cài đặt Appserver của bạn và nó sẽ triển khai và khởi động ứng dụng cho bạn.

Sử dụng tùy chọn "Export-> WAR file" sẽ cho phép bạn lưu tệp chiến tranh.


12

Nếu bạn không biết phải làm gì và bắt đầu lại từ đầu thì Maven có thể giúp bạn bắt đầu.

Bằng cách làm theo các bước dưới đây, bạn có thể thiết lập dự án chiến tranh mới một cách hoàn hảo trong nhật thực.

  1. Tải xuống và cài đặt Maven
  2. Chạy dòng lệnh: mvn archetype:generate
  3. Làm theo các bước được nhắc - chọn dự án web java đơn giản (18) và tên phù hợp.
  4. Khi nó chạy xong: mvn eclipse:eclipse
  5. Khởi động Eclipse. Chọn Tệp -> Nhập -> Dự án hiện có. Chọn thư mục mà bạn đã chạy các mục tiêu mvn.
  6. Vậy là xong, bây giờ bạn sẽ có một khởi đầu rất tốt cho một dự án chiến tranh trong nhật thực
  7. Bạn có thể tự tạo cuộc chiến bằng cách chạy mvn packagehoặc triển khai nó bằng cách thiết lập một máy chủ trong eclipse và chỉ cần thêm dự án vào máy chủ.

Như một số người khác đã nói nhược điểm của việc sử dụng maven là bạn phải sử dụng các quy ước của maven. Nhưng tôi nghĩ nếu bạn chỉ mới bắt đầu, tìm hiểu các quy ước là một ý kiến ​​hay trước khi bạn bắt đầu tự làm. Không có gì ngăn cản bạn thay đổi / cấu trúc lại phương pháp ưa thích của riêng bạn sau này.

Hi vọng điêu nay co ich.



3

Sử dụng mã xây dựng kiến ​​Tôi sử dụng mã này cho SMS dự án của mình

<property name="WEB-INF" value="${basedir}/WebRoot/WEB-INF" />
<property name="OUT" value="${basedir}/out" />
<property name="WAR_FILE_NAME" value="mywebapplication.war" />
<property name="TEMP" value="${basedir}/temp" />

<target name="help">
    <echo>
        --------------------------------------------------
        compile - Compile
        archive - Generate WAR file
        --------------------------------------------------
    </echo>
</target>

<target name="init">
    <delete dir="${WEB-INF}/classes" />
    <mkdir dir="${WEB-INF}/classes" />
</target>

<target name="compile" depends="init">
    <javac srcdir="${basedir}/src" 
                destdir="${WEB-INF}/classes" 
                classpathref="libs">
    </javac>
</target>

<target name="archive" depends="compile">
    <delete dir="${OUT}" />
    <mkdir dir="${OUT}" />
    <delete dir="${TEMP}" />
    <mkdir dir="${TEMP}" />
    <copy todir="${TEMP}" >
        <fileset dir="${basedir}/WebRoot">
        </fileset>
    </copy>
    <move file="${TEMP}/log4j.properties" 
                    todir="${TEMP}/WEB-INF/classes" />
    <war destfile="${OUT}/${WAR_FILE_NAME}" 
                    basedir="${TEMP}" 
                    compress="true" 
                    webxml="${TEMP}/WEB-INF/web.xml" />
    <delete dir="${TEMP}" />
</target>

<path id="libs">
    <fileset includes="*.jar" dir="${WEB-INF}/lib" />
</path>


2

Một tùy chọn khác là xây dựng nó tự động bằng Eclipse. Tất nhiên nếu bạn có môi trường tích hợp liên tục Ant hoặc Maven được khuyến khích. Thay thế xuất không thuận tiện lắm vì bạn phải định cấu hình mỗi khi xuất các thuộc tính.

CÁC BƯỚC:

  1. Bật hỗ trợ "Lưu trữ dự án"; điều này có thể phụ thuộc vào dự án của bạn (tôi đã sử dụng nó trên Java EE / dự án Web). Nhấp chuột phải vào thư mục gốc của dự án; Định cấu hình -> Thêm Hỗ trợ Lưu trữ Dự án.

  2. Đi và tạo một kho lưu trữ mới trong dir hàng đầu "Kho lưu trữ Dự án". Bạn chỉ có tùy chọn jar, nhưng đặt tên cho kho lưu trữ * .war.

  3. Định cấu hình Fileset-s, tức là những tệp nào sẽ được đưa vào. Điển hình là cấu hình hai tập tin tương tự như cách cấu hình Web Deployment Assembly (thuộc tính dự án).

    • copy / WebContent vào /
    • sao chép / xây dựng / các lớp vào WEB-INF / các lớp (tạo bộ tệp này sau khi bạn xác định thư mục WEB-INF / lớp trong kho lưu trữ)
  4. Bạn có thể cần phải chỉnh sửa thuộc tính loại trừ tập tin tùy thuộc vào nơi bạn đặt một số tập tin cấu hình hoặc bạn có thể cần nhiều tập tin hơn, nhưng ý tưởng là một khi bạn đã định cấu hình thì bạn không cần phải thay đổi nó.

  5. Xây dựng kho lưu trữ theo cách thủ công hoặc xuất bản trực tiếp lên máy chủ; nhưng cũng được Eclipse tự động xây dựng cho bạn



2

Sử dụng lệnh sau bên ngoài thư mục WEB-INF. Điều này sẽ tạo ra tệp chiến tranh của bạn và là phương pháp nhanh nhất mà tôi biết.

(Bạn sẽ cần cài đặt JDK 1.7+ và các biến môi trường trỏ đến thư mục bin của JDK của bạn.)

jar -cvf projectname.war *

liên kết tham khảo


0

Giải pháp đơn giản hơn cũng làm mới không gian làm việc Eclipse:

<?xml version="1.0" encoding="UTF-8"?>
<project name="project" default="default">    
    <target name="default">
        <war destfile="target/MyApplication.war" webxml="web/WEB-INF/web.xml">
            <fileset dir="src/main/java" />
            <fileset dir="web/WEB-INF/views" />
            <lib dir="web/WEB-INF/lib"/>
            <classes dir="target/classes" />
        </war>
        <eclipse.refreshLocal resource="MyApplication/target" depth="infinite"/>
    </target>
</project>

0

Mã Shell đơn giản để tạo tệp WAR từ Dự án Web động Eclipse tiêu chuẩn. Sử dụng hệ thống Tệp RAM (/ dev / shm) trên nền tảng Linux.

#!/bin/sh

UTILITY=$(basename $0)

if [ -z "$1" ] ; then
    echo "usage: $UTILITY [-s] <web-app-directory>..."
    echo "       -s ..... With source"
    exit 1
fi

if [ "$1" == "-s" ] ; then
    WITH_SOURCE=1
    shift
fi

while [ ! -z "$1" ] ; do
    WEB_APP_DIR=$1

    shift

    if [ ! -d $WEB_APP_DIR ] ; then
        echo "\"$WEB_APP_DIR\" is not a directory"
        continue
    fi

    if [ ! -d $WEB_APP_DIR/WebContent ] ; then
        echo "\"$WEB_APP_DIR\" is not a Web Application directory"
        continue
    fi

    TMP_DIR=/dev/shm/${WEB_APP_DIR}.$$.tmp
    WAR_FILE=/dev/shm/${WEB_APP_DIR}.war

    mkdir $TMP_DIR

    pushd $WEB_APP_DIR > /dev/null
    cp -r WebContent/* $TMP_DIR
    cp -r build/* $TMP_DIR/WEB-INF
    [ ! -z "$WITH_SOURCE" ] && cp -r src/* $TMP_DIR/WEB-INF/classes
    cd $TMP_DIR > /dev/null
    [ -e $WAR_FILE ] && rm -f $WAR_FILE
    jar cf $WAR_FILE .
    ls -lsF $WAR_FILE
    popd > /dev/null

    rm -rf $TMP_DIR
done

-3

** Tạo tệp War trong dự án web Eclips Gaynemed of grails **

1. dự án nhập khẩu:

2. thay đổi tệp datasource.groovy

Như thế này: url = "jdbc: postgresql: //18.247.120.101: 8432 / PGMS"

2.chuyển đổi AppConfig.xml

3.kill Java từ Trình quản lý tác vụ:

  1. chạy sạch sẽ comand trong nhật thực

  2. chạy 'cuộc chiến thần đồng' theo tên dự án.

  3. Kiểm tra tệp nhật ký và tìm tệp .war tương tự trong thư mục của bàn làm việc có cùng ngày.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.