2

我正在使用以下 Ant 脚本来创建简单的 Web 应用程序之战。

<?xml version="1.0" encoding="UTF-8"?>
<project name="MyProject" default="war">
    <path id="compile.classpath">
        <fileset dir="WebContent/WEB-INF/lib">
            <include name="*.jar" />
        </fileset>
    </path>
    <target name="compile">
        <javac destdir="WebContent/WEB-INF/classes" debug="true" srcdir="src">
            <classpath refid="compile.classpath" />
        </javac>
    </target>
    <target name="war" depends="compile">
        <war destfile="build/myproject.war" webxml="WebContent/WEB-INF/web.xml">
            <fileset dir="WebContent">
                <include name="**/*.jsp" />
            </fileset>
            <lib dir="WebContent/WEB-INF/lib" />
            <classes dir="WebContent/WEB-INF/classes" />
        </war>
    </target>
</project>

它正在创建战争,但是当我打开战争时,由于哪个应用程序未运行,它不包含 JSP 文件。知道有什么问题吗?另外,现在我正在 Weblogic 中手动应对战争。有没有可以部署战争的Ant命令?

4

1 回答 1

1

我不知道确切的答案,但这是我将 Ant build.xml 用于 webapps 的方式。试试看。这可以在 Eclipse 中运行,也可以从命令行运行。几个关键点是:

  • build.xml 引用了编译时库,包括 servlet-api.jar
  • 动态 META-INF/MANIFEST.MF
  • 编译、jar 和 war 任务的单独目标,以便更轻松地按项目自定义规则
  • webapp 战争没有单独的 .class 文件,但编译 web-inf/lib/mywebapp.jar 库以最小化文件系统噪音
  • 您可以创建 web/WEB-INF/classes/ 文件夹并放置一些 .properties 文件或极端情况下的“二进制提供”类文件。它们与其他 jsp、html、js 文件一起放在 war 包中。
  • 文件夹结构非常精简,开发时可以直接在Tomcat服务中使用mywebapp/web/文件夹。每个 html、jsp 等更改都会在运行时反映出来。编译 jar 会触发 Tomcat 重新加载 webapp 实例。

为 webapp 项目使用这个通用文件夹结构。
/mywebapp/ant.bat
/mywebapp/build.xml
/mywebapp/classes/
/mywebapp/src/
/mywebapp/src/META-INF/MANIFEST.MF
/mywebapp/lib/
/mywebapp/web/
/mywebapp/web/WEB -INF/web.xml
/mywebapp/web/WEB-INF/lib/
/mywebapp/web/META-INF/context.xml

mywebapp/build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="mywebapp" default="build" basedir=".">
    <property name="name" value="${ant.project.name}" />
    <property name="classes" value="./classes" />
    <property name="src" value="./src" />
    <property name="webdir" value="./web" />    
    <property name="version" value="1.0"/>

    <property environment="env"/>

    <path id="libs"> 
        <pathelement location="lib/servlet-api.jar" />
        <pathelement location="web/WEB-INF/lib/somelib1.jar" />
        <pathelement location="web/WEB-INF/lib/somelib2.jar" />
        <pathelement location="web/WEB-INF/lib/gson-2.2.4.jar" />
    </path>

    <tstamp>
       <format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" />
    </tstamp>


    <target name="updatemanifest" description="Update manifest">
       <buildnumber file="build.num"/>

       <copy file="${src}/META-INF/MANIFEST.MF" 
          todir="${classes}/META-INF/" overwrite="true" preservelastmodified="true"
       />

       <manifest file="${classes}/META-INF/MANIFEST.MF" mode="update">
          <attribute name="Implementation-Version" value="${version}.${build.number} (${TODAY})" />
          <attribute name="Implementation-Title"   value="${name}" />       
       </manifest>      
    </target>

    <target name="clean" description="Clean compiled classes">
        <delete dir="${classes}" />
    </target>

    <target name="compile" depends="clean" description="Compile classes">
        <mkdir dir="${classes}"/>
        <javac srcdir="${src}" destdir="${classes}" target="1.6" source="1.6" encoding="ISO-8859-1" 
            debug="true" debuglevel="lines,source"
            excludes="" includeantruntime="false" >
            <classpath refid="libs" />
            <compilerarg value="-Xlint:deprecation" />
        </javac>
    </target>

    <target name="jar" depends="updatemanifest" description="Create a .jar file">
        <echo message="Build release: ${release}" />        
        <jar
            manifest="${classes}/META-INF/MANIFEST.MF" 
            jarfile="${webdir}/WEB-INF/lib/${name}.jar" >
           <fileset dir="${classes}">
           </fileset>
        </jar>
    </target>

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

    <target name="build" depends="war" description="Build lib">
    </target>

</project>

src/META-INF/MANIFEST.MF

Implementation-Title: myappname   
Implementation-Version: 1.0.0 (2010-03-01)   
Implementation-Vendor: My Name Ltd.   
Implementation-URL: http://www.myname.com   

mywebapp/build.bat

call c:\apache-ant-1.7.0\bin\ant.bat build   
pause  

构建脚本创建战争包和 web-inf/lib/mywebapp.jar 中的 manifest.mf 已更新为具有构建号、标题和版本。非常方便,您可以将文件夹内容用作新 webapp 项目的模板。只需编辑 build.xml 以获得新的项目名称。

一些编译时依赖项指向 mywebapp/web-inf/lib 文件夹。非 war 打包的库仅在编译时放入 mywebapp/lib/ 文件夹。我喜欢将每个依赖项保留在项目版本控制中,这就是这个 lib 文件夹的原因。您可以使用 *.jar 通配符 ant 语法,但我明确列出每个文件以用于自我说明。

这是开发期间在 Tomcat 中使用的奖励文件。它在 Tomcat 上发布 webapp,并且可以立即看到项目文件夹中的任何更改,这对于客户端文件更改(html、js、jsp)非常方便。

  • 此文件是来自 mywebapp/web/META-INF/context.xml 文件的复制粘贴,但添加了显式 docBase 属性。
  • 它指示 Tomcat 直接使用项目文件夹中的文件,无需在运行时重新部署
  • 启动 tomcat 并保持运行,您可以使用同一个 Tomcat 实例运行多个 webapp 项目。有时更大的开发项目需要它。
  • 远程调试钩子需要一些这里没有包含的 java 魔法

tomcat/conf/Catalina/localhost/mywebapp.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="C:/mywebapp/web"
    debug="0" reloadable="true" crossContext="true" >

<!--
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
    allow="127.0.0.1" />
-->

<!--
   <Valve className="org.apache.catalina.valves.RequestDumperValve"/>
-->

  <!-- pooled db connection -->
    <Resource name="jdbc/mywebappDB" auth="Container" type="javax.sql.DataSource" 
        maxActive="10" maxIdle="2" maxWait="20000" 
        driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" 
        username="myuserid" password="mypwd" 
        url="jdbc:sqlserver://mysqlserv1.com:1433;DatabaseName=MyDB;applicationName=mywebapp" 
        validationQuery="SELECT 1" 
    />
    <!-- <ResourceLink name="jdbc/mywebappDB" global="jdbc/mywebappDB" type="javax.sql.DataSource" /> -->


    <Resource name="jdbc/mywebappDB2" auth="Container" type="javax.sql.DataSource"
        maxActive="100" maxIdle="20" maxWait="10000"
        driverClassName="com.mysql.jdbc.Driver"
        username="myuserid" password="mypwd"
        url="jdbc:mysql://localhost:3306/myDB2?useUnicode=true&amp;characterEncoding=utf8"
        validationQuery="SELECT 1" removeAbandoned="true" removeAbandonedTimeout="300"
      />

</Context>

ps:不管有人说什么,Ant 构建系统都很好。随你便。

于 2013-08-27T08:20:04.933 回答