【问题标题】:How to include Classpath Jars in a war file using Ant如何使用 Ant 在 war 文件中包含 Classpath Jas
【发布时间】:2015-02-03 19:50:01
【问题描述】:

我正在创建一个 ant 脚本来构建和部署一个项目。我的项目结构如下:

 Projectname
--src
--tst
--lib ( I have 5 jars here)
--resources
--WebContent
      --META-INF
      --WEB-INF
            --lib (I have 3 jars here)
            --properties
            --templates
            --stylesheets
            --web.xml

我的要求是我必须编写一个 ant 脚本来构建项目并在暂存环境(不是本地)中创建一个 war 文件。战争应该包含类路径中所有可用的 jar 文件(类路径有 50 多个 jar)。 但是当我运行我的 ant 脚本时,它只显示了 8 个 jar,它们在 lib 文件夹中可用,并且不包括类路径中的 jar。

如何在创建 War 文件时添加类路径?以下是我为创建战争而编写的脚本。

<target name="war" description="Bundles the application as a WAR file" depends="build">
            <echo> === PACKAGE WAR ====== </echo>
             <delete dir="target" failonerror="false"/>
             <mkdir dir="target"/>
            <war destfile="target/test.war" needxmlfile="false" >
                <fileset dir="WebRoot">
                    <include name="**/*.*"/>
                </fileset>
                <lib dir ="lib">
                    <include name="**/*.*"/>
                </lib>
<classes dir="WebContent/WEB-INF/classes"/>
            </war>
</target>

类路径在ant脚本中如下。

 <property name="ExternalJars.location" value="../ExternalJars"/>
 <path id="Services.classpath">
<fileset dir="lib">
        <include name="**/*.jar"/>
    </fileset>
</path>

【问题讨论】:

    标签: java ant jar war


    【解决方案1】:

    尝试添加任务:

    <war destfile="target/test.war" needxmlfile="false" > <fileset dir="WebRoot"> <include name="**/*.*"/> </fileset> <path> <path refid="Services.classpath"/> </path> <lib dir ="lib"> <include name="**/*.*"/> </lib> <classes dir="WebContent/WEB-INF/classes"/> </war>

    【讨论】:

    • 噢噢噢,它就像一个魅力。谢谢你,非常感谢。:) 你拯救了我的一天。但问题是战争的结构应该是,WEB__INF,MANIFEST.MF 和WEB-INF-lib 应该有所有这些罐子。上面的代码就像一个魅力,但它包含在带有 WEB-INF 和 MANIFEST.MF 的基本目录中的 jar 文件,而不是在 WEB-INF-lib 中。
    • 不使用类路径: 你可以使用 其中 dir - 是您在类路径中的文件集
    • 但是我们如何引用 services.classpath 呢?包括类路径罐子。
    • @user2821894 将路径包装到chainedmapper 有效,因为这个答案stackoverflow.com/a/35694277/2465785
    【解决方案2】:

    您的 50 个罐子在哪里?尝试像在您的任务中一样添加您的类路径文件夹。像这样的:

    <war destfile="target/test.war" needxmlfile="false" > <fileset dir="WebRoot"> <include name="**/*.*"/> </fileset> <fileset dir="${classpath_folder}"> <include name="*.jar"/> </fileset> <lib dir ="lib"> <include name="**/*.*"/> </lib> <classes dir="WebContent/WEB-INF/classes"/> </war>

    【讨论】:

    • 感谢您的快速回复。该项目与其他一些项目有依赖关系,它从类路径中获取剩余的 jars
    • 你对暂存环境有这个依赖吗?您如何描述 Ant 中的类路径?
    • 上面的代码不起作用,因为它说类路径不是目录。
    • 我将我的类路径描述如下:
    • 尝试添加war任务元素路径:&lt;war destfile="target/test.war" needxmlfile="false" &gt; &lt;fileset dir="WebRoot"&gt; &lt;include name="**/*.*"/&gt; &lt;/fileset&gt; &lt;path&gt; &lt;path refid="Services.classpath"/&gt; &lt;/path&gt; &lt;lib dir ="lib"&gt; &lt;include name="**/*.*"/&gt; &lt;/lib&gt; &lt;classes dir="WebContent/WEB-INF/classes"/&gt; &lt;/war&gt;
    【解决方案3】:

    我通过使用 mappedresources 找到了一个解决方案,虽然有点不舒服,但很有效

    <war destfile="target/test.war" needxmlfile="false" >
        <fileset dir="WebRoot" />
        <lib dir ="lib" />
        <classes dir="WebContent/WEB-INF/classes"/>
    
        <mappedresources>
            <path refid="Services.classpath"/>
            <chainedmapper>
                <flattenmapper />
                <globmapper from="*.jar" to="WEB-INF/lib/*.jar" />
            </chainedmapper>
        </mappedresources>
    </war>
    

    【讨论】:

      猜你喜欢
      • 2014-11-12
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      相关资源
      最近更新 更多