在 Eclipse 上使用 Ant 创建 war 之前刷新不起作用

Refresh doesn't work before creating a war with Ant on Eclipse

在 Eclipse 上,我使用 ant 创建 war 文件。

问题是 war 文件中没有包含正确的 mypropfile.properties。 文件已正确复制,但如果我使用 <eclipse.refreshLocal resource="projectdir" depth="infinite"/>,旧文件也会包含在内。我必须手动刷新项目。

对于 Ant,我使用 "Run in the same JRE as the workspace" 选项。

<?xml version="1.0" encoding="UTF-8"?>
<project name="MyProject" basedir=".">
<description>
    My Project
</description>

<property name="workspace.dir" value="${basedir}/../../"/>
<property name="src" value="${basedir}/../src"/>
<property name="build" value="${basedir}/../build"/>
<property name="build.classes" value="${basedir}/../build/classes"/>
<property name="lib.dir" value="${basedir}/WEB-INF/lib"/>
<property name="web.dir" value="${basedir}/WEB-INF"/>
<property environment="env"/>
<property name="real.dir" value="${basedir}/real"/>
<property name="real2.dir" value="${basedir}/real2"/>

<path id="classpath.server">  
    <fileset dir="${env.CATALINA_HOME}/lib" includes="*.jar"/>  
    <pathelement path="${build.classes}"/>
</path>

<path id="classpath.app">  
    <fileset dir="${lib.dir}" includes="*.jar"/>  
</path> 

<target name="refreshResource" if="eclipse.refreshLocal">
    <eclipse.refreshLocal resource="projectdir" depth="infinite"/>
</target>

<target name="clean">
    <delete dir="${build}/classes"/>
    <delete dir="${build}"/>
</target>

<target name="init" depends="clean, refreshResource">
    <tstamp/>
    <mkdir dir="${build}"/>
    <mkdir dir="${build}/classes"/>
</target>

<target name="compile" depends="init">
    <javac encoding="UTF8" srcdir="${src}" destdir="${build}/classes"    includeantruntime="false">
        <compilerarg value="-Xlint:unchecked"/>
        <classpath>  
            <path refid="classpath.server.bin"/>  
        </classpath>
        <classpath>  
            <path refid="classpath.server"/>  
        </classpath> 
        <classpath>
            <path refid="classpath.app"/>
            <fileset dir="${lib.dir}" includes="*.jar"/>  
         </classpath>
    </javac>
</target>

<target name="deleteConfig">
    <delete file="${src}/mypropfile.properties"/>
</target>

<target name="real" depends="deleteConfig">
    <copy file="${real.dir}/realprop.properties" tofile="${src}/mypropfile.properties"/>
</target>

<target name="real2" depends="deleteConfig">
    <copy file="${real2.dir}/real2prop.properties" tofile="${src}/mypropfile.properties"/>
</target>

<target name="war-real" depends="real, compile">
    <input message="Warname (without .war):" addproperty="warname"/>
    <war destfile="${workspace.dir}/${warname}.war" webxml="${web.dir}/web.xml">
        <fileset dir="${basedir}">
            <include name="**/*.*"/>
        </fileset>
        <classes dir="${build.classes}"/>
    </war>
</target>

<target name="war-real2" depends="real2, compile">
    <input message="Warname (without .war):" addproperty="warname"/>
    <war destfile="${workspace.dir}/${warname}.war" webxml="${web.dir}/web.xml">
        <fileset dir="${basedir}">
          <include name="**/*.*"/>
        </fileset>
        <classes dir="${build.classes}"/>
    </war>
</target>

编辑

目标清除错误,所以我已更正它,但现在构建失败并出现错误

BUILD FAILED ... Reference classpath.server.bin not found.

Ant 不关心 Eclipse 是否刷新了文件。 eclipse.refreshLocal 仅与 IDE.

内部的编辑器和编译器相关

当您 运行 Ant build.xml 时,Ant 将 real 目标中的相关文件复制到源文件夹中,然后 compile 将其复制到 ${build}/classes(至少它应该这样做)。因此,在创建 WAR 之前,您必须确保 compile 步骤已完成其工作(即查看每个文件以确保在每个副本中都可以看到更改)。

我担心的是您使用不同的方式访问 classes:

  • ${build}/classes
  • ${build.classes}
  • ${basedir}/../build/classes

所以第一步应该是定义一个单一的方法来定位文件夹,然后在任何地方都使用这个模式。

如果这不能解决您的问题,您需要确保 Ant 注意到文件已更改。像 FAT 这样的旧文件系统只支持具有第二分辨率的时间戳。如果您使用 USB 记忆棒作为源,则可以更改文件和 运行 Ant 如此之快以至于 Ant 认为文件没有更改。

最后,您需要检查您的类路径。如果其中一个 JAR 依赖项还包含名为 mypropfile.properties 的文件,则 Java 资源加载可以找到任一版本。

这个问题和其他问题让我使用了不同的解决方案来配置 WAR 文件:我传递一个带有配置文件绝对路径的系统 属性。这样,WAR 文件在配置更改时不会更改,我可以完全控制加载哪个配置文件。