我在ant的build.xml脚本中设置了这个属性,以便在构建过程中忽略系统类路径,但ant仍然在我的java调用中获取系统类路径并将其与构建脚本中指定的类路径合并。
<property name="build.sysclasspath" value="ignore" />
<path id="classpath">
<pathelement path="${buildDir}/classes" />
<fileset dir="${prjdir}">
<include name="lib/*.jar"/>
</fileset>
</path>
<java classname="com.ibm.biginsights.fs.gpfs.LoggingInjector" failonerror="true">
<classpath refid="classpath" />
</java>
如果在调用ant之前取消设置$CLASSPATH
环境变量,一切都会正常工作。怎么了?
ANT本身就是一个java程序,因此很难阻止任务使用相同的系统类路径。
为了正确地隔离您的java构建,我建议在javac任务上设置以下属性:
<javac .... includeAntRuntime="false" includeAntRuntime="false" ...
类似地,当运行java程序时,设置fork属性,使其在另一个VM中运行:
<java ...fork="true" classpathref="class.path.that.i.control"...
此属性AFAIK是必须传递给ant的系统属性(使用ant -Dbuild.sysclasspath=ignore
)。但取消设置CLASSPATH可能也同样容易。
IMO的主要问题是首先使用CLASSPATH环境变量。我发现在使用Java时,最好总是使用-cp或-jar选项,而不依赖于系统CLASSPATH。一旦有两个Java程序都依赖于系统CLASSPATH,这两个程序的依赖关系就有冲突的风险。