在 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 文件在配置更改时不会更改,我可以完全控制加载哪个配置文件。
在 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 文件在配置更改时不会更改,我可以完全控制加载哪个配置文件。