Ведущий обратный слеш в именах путей в Java - PullRequest
0 голосов
/ 26 июля 2011

Итак, я пытаюсь закодировать обычное Java-приложение, которое читает текущую ревизию из файла, который обновляется ANT во время компиляции. При запуске на моем компьютере разработчика (Eclipse 3.5.2 в Ubuntu 11.04) с OpenJDK или SunJDK выдает FileNotFoundException. Добавление или удаление начального обратного слеша, похоже, не имеет никакого эффекта.

Есть идеи, как мне это решить? Я считаю, что ошибка заключается в этой строке здесь:

in = new FileInputStream("data/build_info.properties");

Код - Обновлен

Переход к свойствам Java

String revision = "";

Properties defaultProps = new Properties();
FileInputStream in;
try {
    in = new FileInputStream("data/build_info.properties");
    defaultProps.load(in);
    in.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

revision = "Version: " + defaultProps.getProperty("build.major.number") + "." +
defaultProps.getProperty("build.minor.number") + "    " +
"Revision: " + defaultProps.getProperty("build.revision.number");

ANT Jar Script

<target name="jar">
    <antcall target="clean" />
    <antcall target="compile" />

    <jar destfile="${dir.dist}/${name.jar}" basedir="." includes="${dir.lib}/*" filesetmanifest="mergewithoutmain">
        <manifest>
            <attribute name="Main-Class" value="emp.main.EmpowerView" />
        </manifest>
        <fileset dir="${dir.build}" includes="**/*" excludes="META-INF/*.SF" />
        <fileset dir="." includes="${dir.media}/*" />
        <fileset dir="." includes="${dir.data}/*" />
    </jar>
    <chmod file="${dir.dist}/${name.jar}" perm="+x" />

</target>

Ответы [ 3 ]

1 голос
/ 27 июля 2011

Если вы пытаетесь загрузить файл внутри Jar-файла, вам нужно использовать java.lang.Class.getResourceAsStream() для загрузки файла.Вы не можете указать на файл, который находится в банке с java.util.File.Пример использования этого см. В следующем ответе:

https://stackoverflow.com/questions/4548791

1 голос
/ 26 июля 2011

Можете ли вы пройти через отладчик? Я заметил, что у вас есть файлы System.out.println - они печатаются без комментариев?

Несмотря на это, я не вижу, как ревизия равна нулю - это может быть пустая строка из-за IOException, но не ноль.

0 голосов
/ 26 июля 2011

То, что происходит здесь, происходит следующим образом: вызов newfile() или FileUtils.readLines() вызывает IOException.
Это обнаруживается по адресу:

} catch (IOException e) {
    revision = "" + e.getCause();
}

и устанавливает значение revision = значениеe.getCause() с префиксом пустой строки.

e.getCause() возвращает текст null , что заставляет меня поверить, что исключение выдается FileUtils.readLines().
Проверьте это, изменив revision = "" + e.getCause(); на revision = "XXX->" + e.getCause();, после чего, я ожидаю, вы обнаружите, что значение revision после вызова равно = "XXX-> null".

IOException с причиной = null выбрасывается, потому что файл data/build_info.properties не может бытьрасположен.

Таким образом, вам нужно проверить значение вашего текущего рабочего каталога, когда вы запускаете этот код, и убедиться, что data/build_info.properties может быть разрешена относительно этого пути.

...