我正在开发一个简单的构建脚本,该脚本应该从 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>

但不幸的是蚂蚁任务 加载属性 失败:

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

之后,我尝试使用以下命令行从 Eclipse 外部运行 Ant:

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不兼容吗?

最后一个提示:从 Ant 目标中删除 bcel 类路径条目会导致以下结果:

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)

更新 在Eclipse中设置Ant首选项后,错误消息发生了变化:

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 会很糟糕!——麦克道尔

有帮助吗?

解决方案

糟糕,我就知道!归根结底是文件编码问题。这些文件仍然采用 ISO-8819-1 格式,但我使用的是 UTF-8。该项目已经相当陈旧,并且是使用错误的编码创建的。设置参数 编码 在里面 javac加载属性 任务修复它。

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

我以为它被我们的 Subversion 服务器更改了,但我想我现在必须自己将每个文件转换为 UTF-8...认为这是另一个问题。

其他提示

文档说嵌套的类路径元素是具有使用资源属性 - 替代使用的 SRCFILE

在BCEL JAR添加到您的全局类路径。在Eclipse中,其添加为全局进入到类路径中的运行时预置。在命令行上,使用 -lib 开关。

“ALT文本” 结果 <子>(来源:蚀。有机

看起来像一个类路径错误。运行“ant -v”来给你错误的一些更详细。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top