使用 Ant 创建战争时 JSP 不会被复制

2024-02-01

我正在使用以下 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命令?


我不知道确切的答案,但这是我使用 Ant build.xml 进行 Web 应用程序的方法。试一试。这可以在 Eclipse 中工作或从命令行运行。几个关键点是:

  • build.xml 引用了编译时库,包括 servlet-api.jar
  • 动态 META-INF/MANIFEST.MF
  • 编译、jar 和 war 任务的单独目标,以便更轻松地按项目自定义规则
  • webapp war 没有单独的 .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/类/
/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  

构建脚本创建 war 包,并且 web-inf/lib/mywebapp.jar 中的 manifest.mf 已更新为包含构建号、标题和版本。您可以非常方便地使用文件夹内容作为新 Web 应用程序项目的模板。只需编辑 build.xml 即可获得新的项目名称。

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

这是开发期间在 Tomcat 中使用的奖励文件。它在 Tomcat 上发布 web 应用程序,项目文件夹中的任何更改都会立即看到,这对于客户端文件更改(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 构建系统都很好。随意吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Ant 创建战争时 JSP 不会被复制 的相关文章

随机推荐

  • 如何解析不带引号的 KEY 字符串的 JSON?

    我想解析 iOS SBJSON 框架中以下 url 产生的 json 输出 while 1 title school Google Maps url maps q school x26mrt yp x26sll 13 006389 80 2
  • 使用python向bot框架添加自适应卡

    我正在从这里玩一点 python 机器人框架的示例https github com Microsoft botbuilder python https github com Microsoft botbuilder python现在我想在响
  • iOS 上国家/地区代码的电话号码格式

    我需要将电话号码格式显示为占位符UI文本字段 我怎样才能做到这一点 对于国家 地区选择 我使用下面提到的库 它为我提供了针对用户选择的国家 地区的国旗和国家 地区代码 https github com NikKovIos NKVPhoneP
  • 在多线程环境中读取值

    我正在浏览有关线程和锁的 JLS 文档http docs oracle com javase specs jls se7 html jls 17 html jls 17 5 http docs oracle com javase specs
  • swprintf 在 8 位范围之外的字符上被阻塞

    这种情况发生在 OS X 上 但我怀疑它适用于任何 UNIX y 操作系统 我有两个看起来像这样的字符串 const wchar t test1 const wchar t x44 x00 x00 x00 x73 x00 x00 x00 x
  • 在 jMeter 的值字段中使用变量

    我添加了一个用户定义变量元素 然后创建一个值为 123456 的变量 Parameter 并将其传递到 GET 请求中 创建了第二个变量 Response 其值为 无效代码 123456 我添加了一个响应断言元素 将 Response 变量
  • 当 pyinstaller 发现版本冲突时手动指定库

    使用 pyinstaller 时是否可以在 Mac OSX 上手动替换或指定 dylib 的位置 我在尝试打开已完成的 app 时收到错误 Traceback most recent call last File DeepMeerkat m
  • NHibernate 和共享网络托管

    有没有人能够在共享网络主机上启动并运行基于 NHibernate 的项目 NHibernate 在幕后用反射做了很多奇特的事情 但我目前使用的主机只允许应用程序以中等信任度运行 这限制了你可以用反射做的事情 并且它会带来各种安全性权限错误
  • Android Studio:Gradle 构建失败 - 任务“:compileDebugAidl”执行失败

    在 Android Studio I O 预览 AI 130 677228 中更改源代码并使用 gradle 进行构建后 构建失败并出现以下错误 Gradle FAILURE Build failed with an exception W
  • 选择列表中的 HTML 复选框

    我正在尝试在选择列表中构建一个复选框列表 例如此处的国家 地区列表 链接文本 https careers microsoft com Search aspx 我正在使用 Asp net MVC 因此它需要是 pure html JavaSc
  • Elasticsearch:如何删除映射类型而不删除整个索引?

    是否可以从索引中删除单个映射类型而不删除整个索引 https www elastic co guide en elasticsearch reference current indices delete mapping html https
  • 如何使用 data-href 打开新选项卡

    我正在使表格行可单击 但单击后我想打开一个新选项卡 我尝试使用data target但这没有用 tr class table row tr 可以这样做 jQuery JSFiddle 1
  • 如何使用 Youtube API 为 Youtube 视频添加字幕?

    是否有可能添加字幕 to Youtube视频使用Google Youtube API v3 重要条件 视频不是所有者 任务 使用所选语言添加自定义字幕Google APIs Client Library for JavaScript Goo
  • Python MS Word [重复]

    这个问题在这里已经有答案了 可能的重复 在 Python 中读取 写入 MS Word 文件 https stackoverflow com questions 188444 reading writing ms word files in
  • NSString 的 Base64 编码 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • TCP 数据包“不分段”的好处?

    我们的一位客户在将数据从我们的应用程序 在他们的 PC 上 提交到服务器 不同的地理位置 时遇到问题 当发送低于 1100 字节的数据包时 一切正常 但在此之上 我们看到 TCP 每隔几秒重新传输一次数据包 但没有得到任何响应 我们用于测试
  • constexpr(即常量初始化)模板变量的初始化顺序是否有保证?

    From en cppreference com w cpp language initialization http en cppreference com w cpp language initialization 无序动态初始化 si
  • 如何在 Angular 2 中有条件地加载模块

    下面的代码可以根据不同的 Angular cli 环境变量有条件地加载模拟服务 然而 它有一个副作用 即模拟服务被内置到最终的转码和缩小的输出文件中 是否有更好的方法来完成Angular2中的延迟加载模块 应用程序模块 ts import
  • “关联表”(多对多关系)的正确名称是什么[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 关联表 的正确或最流行的名称是什么 我听说过查找 关联 解析 映射和联结表 没有 正确 的名称 但学术名称将是 关联表 请参阅 维基百科文章关联
  • 使用 Ant 创建战争时 JSP 不会被复制

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