Ant 로드 속성이 실패했습니다(bcel 오류?)
-
22-08-2019 - |
문제
저는 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 오류인가요?내 bcel과 Ant가 호환되지 않습니까?
마지막 힌트: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로 변환해야 할 것 같습니다...그것이 SO에 대한 또 다른 질문이라고 생각하십시오.
다른 팁
그만큼 문서화 로드 프로퍼티 중첩된다고 말합니다 클래스 경로 요소는 다음과 함께 사용합니다 자원 속성 - 사용의 대안 srcfile.
Bcel Jar를 글로벌 클래스 경로에 추가하십시오. Eclipse에서는 ClassPath에 대한 글로벌 항목으로 추가하십시오. 런타임 환경 설정. 명령 줄에서 사용하십시오 -lib 스위치.
(원천: eclipse.org)
ClassPath 오류처럼 보입니다. "Ant -V"를 실행하여 오류에 대한 자세한 정보를 제공하십시오.