Сбой загрузки свойств Ant (ошибка bcel?)

Я работаю над простым скриптом сборки, который должен получить некоторые константы из файла класса java и использовать их в качестве номеров версий в именах моих файлов. Я использую Eclipse и его собственный Ant, но помещаю bcel-5.2.jar в свою папку libs и в путь к классам для вызова Ant.

<target name="generate_version" depends="compile">
    <loadproperties srcfile="${dir.dest}/MyVersion.class">
        <classpath>
            <fileset dir="${dir.libs}">
                <include name="**/bcel*.jar"/>
            </fileset>
        </classpath>

        <filterchain>
            <classconstants/>
        </filterchain>
    </loadproperties>
</target>

Но, к сожалению, задача ant loadproperties не выполняется:

build.xml:46: expected a java resource as source

После этого я попытался запустить Ant из-за пределов Eclipse, используя эту командную строку:

set ANT_HOME=C:\Program Files\Java\ant\apache-ant-1.7.1
"%ANT_HOME%\bin\ant.bat"

Результат

Buildfile: build.xml

init:
     [echo] Building project.
     [echo] ant.home:          C:\Program Files\Java\ant\apache-ant-1.7.1
     [echo] ant.java.version:  1.6
     [echo] ant.version:       Apache Ant version 1.7.1 compiled on June 27 2008

compile:
    [javac] Compiling 262 source files to **********\build
    [javac] Note: Some input files use or override a deprecated API.
    [javac] Note: Recompile with -Xlint:deprecation for details.
    [javac] Note: Some input files use unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.

generate_version:

BUILD FAILED
********************\ant\build.xml:46: expected a java resource as source

Я действительно потерялся сейчас. Это ошибка bcel? Это несовместимость Ant с моим собственным bcel?

Последний совет: удаление записи пути к классам bcel из цели Ant приводит к следующему:

Buildfile: build.xml

init:
     [echo] Building project.
     [echo] ant.home:          C:\Program Files\Java\ant\apache-ant-1.7.1
     [echo] ant.java.version:  1.6
     [echo] ant.version:       Apache Ant version 1.7.1 compiled on June 27 2008

compile:
    [javac] Compiling 262 source files to ********************\build
    [javac] Note: Some input files use or override a deprecated API.
    [javac] Note: Recompile with -Xlint:deprecation for details.
    [javac] Note: Some input files use unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.

generate_version:

BUILD FAILED
java.lang.NoClassDefFoundError: org/apache/bcel/classfile/ClassParser
        at org.apache.tools.ant.filters.util.JavaClassHelper.getConstants(JavaClassHelper.java:47)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

ОБНОВЛЕНИЕ После установки настроек Ant в Eclipse сообщение об ошибке изменилось:

BUILD FAILED
*********************\build.xml:46: org.apache.bcel.classfile.ClassFormatException:  is not a Java .class file
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:115)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:357)
    at org.apache.tools.ant.Target.performTasks(Target.java:385)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
    at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
    at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)

Теперь я думаю, что это может быть конфликт версий между Ant и BCEL. Или BCEL и JDK1.6. Или Eclipse, и BCEL, и Ant, или JDK... Я потерялся.


ОТВЕТ:

Это комментарий, найденный ниже

Я должен был упомянуть об этом - вам не нужно ничего конвертировать. Док: «начиная с Ant 1.7 кодировка символов ISO-8859-1 используется для преобразования символов обратно в байты, поэтому ОДИН ДОЛЖЕН ИСПОЛЬЗОВАТЬ ЭТУ КОДИРОВАНИЕ для чтения файла класса java». Это просто соглашение, чтобы обойти тот факт, что фильтр символов используется для необработанных байтов. ant.apache.org/manual/CoreTypes/… Использование UTF-8 было бы плохо! - Макдауэлл


person cringe    schedule 18.05.2009    source источник
comment
Я думаю, что это сведется к некоторым проблемам совместимости с BCEL и JDK. не является файлом .class Java, указывает на несоответствующую версию класса (первые 4 байта в .class), которая не распознается BCEL. Я снова пытаюсь скомпилировать с JDK1.4.   -  person cringe    schedule 18.05.2009


Ответы (3)


Черт, я так и знал! Это сводится к проблемам с кодировкой файлов. Файлы все еще в формате ISO-8819-1, но я использую UTF-8. Проект довольно устарел и был создан с неправильной кодировкой. Установка параметра encoding в задаче javac и loadproperties исправляет это.

<target name="generate_version" depends="compile">
    <loadproperties encoding="iso-8859-1" srcfile="${dir.dest}/MyVersion.class">
        <filterchain>
            <classconstants/>
        </filterchain>
    </loadproperties>
</target>

Я думал, что он был изменен нашим сервером Subversion, но я думаю, что теперь мне нужно самостоятельно конвертировать каждый файл в UTF-8 ... думаю, это еще один вопрос для SO.

person cringe    schedule 18.05.2009
comment
Я должен был упомянуть об этом - вам не нужно ничего конвертировать. Док: начиная с Ant 1.7 кодировка символов ISO-8859-1 используется для преобразования символов обратно в байты, поэтому ОДИН ДОЛЖЕН ИСПОЛЬЗОВАТЬ ЭТУ КОДИРОВАНИЕ для чтения файла класса java. Это просто соглашение, чтобы обойти тот факт, что фильтр символов используется для необработанных байтов. ant.apache.org/manual/CoreTypes/filterchain.html Использование UTF- 8 было бы плохо! - person McDowell; 18.05.2009
comment
Хм, я не уверен на 100%, правильно ли я понял. Я перезапущу сборку с преобразованными файлами и оригинальными и применю/удалю параметр кодирования, чтобы получить ответ. Но сначала я зафиксирую конвертированные файлы... ;-) - person cringe; 19.05.2009
comment
Хорошо, действительно единственным недостатком было отсутствующее значение параметра encoding=iso-8859-1. Спасибо @McDowell! Я предполагаю, что я должен был использовать RTFM всю цепочку фильтров. :-( - person cringe; 19.05.2009
comment
Ссылка на цепочку фильтров перемещена по адресу: ant.apache.org/manual/Types/filterchain. html - person martin clayton; 22.02.2011

В документации для loadproperties говорится, что вложенный < em>classpath используется с атрибутом resource — альтернатива использованию srcfile.

Добавьте банку BCEL в свой глобальный путь к классам. В Eclipse добавьте его как глобальную запись в путь к классам в файле настройка среды выполнения. В командной строке используйте переключатель -lib.

alt text
(источник: eclipse.org)

person McDowell    schedule 18.05.2009
comment
Ах, это помогло - по крайней мере, на несколько секунд. Я обновил вопрос. - person cringe; 18.05.2009

Похоже на ошибку пути к классам. Запустите «ant -v», чтобы получить более подробную информацию об ошибках.

person Community    schedule 18.05.2009