Я только начинаю работать с Ant, и у меня проблемы с запуском цели. Часть моего кода загружает файл свойств, и он всегда не может найти этот файл, если я не заставлю свою цель запуска использовать новую JVM. Ниже приведен очень упрощенный пример, цель «run» не работает, цель «run_fork» работает. Насколько я понимаю, у Ant есть собственный загрузчик классов, который заменяет загрузчик по умолчанию, поэтому я полагаю, что это каким-то образом искажает путь поиска. Могу ли я каким-либо образом изменить свой код, чтобы это работало без необходимости создания новой JVM?
build.xml:
<project name="PropsExample" default="compile" basedir=".">
<property name="src" location="src"/>
<property name="bin" location="bin"/>
<target name="init">
<tstamp/>
<mkdir dir="${bin}"/>
</target>
<target name="compile" depends="init">
<javac includeAntRuntime="false" srcdir="${src}" destdir="${bin}"/>
<copy todir="${bin}">
<fileset dir="${src}" includes="**/*.properties"/>
</copy>
</target>
<target name="clean">
<delete dir="${bin}"/>
<delete dir="${dist}"/>
</target>
<target name="run" depends="compile">
<java classname="com.example.Test">
<classpath>
<pathelement location="${bin}"/>
</classpath>
</java>
</target>
<target name="run_fork" depends="compile">
<java fork="true" classname="com.example.Test">
<classpath>
<pathelement location="${bin}"/>
</classpath>
</java>
</target>
example code:
package com.example;
import java.util.Properties;
import java.io.InputStream;
public class PropertiesLoader {
public static String getProperty() throws Exception {
InputStream in = ClassLoader.getSystemResourceAsStream("com/example/test.properties");
if ( in == null ) {
throw new Exception("Cannot find test.properties");
}
Properties p = new Properties();
p.load(in);
in.close();
return p.getProperty("test");
}
}
а также:
package com.example;
public class Test {
public static void main(String[] args) throws Exception {
try {
System.out.println(PropertiesLoader.getProperty());
} catch ( Exception e ) {
e.printStackTrace(System.out);
}
}
}