通过 antlib.xml 公开的自定义 ant 任务
Custom ant task exposed thru antlib.xml
我有一个 jar,里面有一个 ant 任务。我的com/mebigfatguy/stringliterals/antlib.xml是
<antlib xmlns:stringliterals="ant:com.mebigfatguy.stringliterals">
<taskdef name="stringliterals" classname="com.mebigfatguy.stringliterals.StringLiteralsTask"/>
</antlib>
运行ning jar tf stringliterals.jar 我得到
META-INF/
META-INF/MANIFEST.MF
com/
com/mebigfatguy/
com/mebigfatguy/stringliterals/
com/mebigfatguy/stringliterals/antlib.xml
com/mebigfatguy/stringliterals/SLClassVisitor.class
com/mebigfatguy/stringliterals/StringLiteralsTask.class
com/mebigfatguy/stringliterals/SLMethodVisitor.class
com/mebigfatguy/stringliterals/Literal.class
META-INF/maven/
META-INF/maven/com.mebigfatguy.stringliterals/
META-INF/maven/com.mebigfatguy.stringliterals/stringliterals/
META-INF/maven/com.mebigfatguy.stringliterals/stringliterals/pom.xml
META-INF/maven/com.mebigfatguy.stringliterals/stringliterals/pom.properties
com/mebigfatguy/org/
com/mebigfatguy/org/objectweb/
com/mebigfatguy/org/objectweb/asm/
com/mebigfatguy/org/objectweb/asm/AnnotationVisitor.class
com/mebigfatguy/org/objectweb/asm/AnnotationWriter.class
com/mebigfatguy/org/objectweb/asm/Attribute.class
com/mebigfatguy/org/objectweb/asm/ByteVector.class
com/mebigfatguy/org/objectweb/asm/ClassReader.class
com/mebigfatguy/org/objectweb/asm/ClassVisitor.class
com/mebigfatguy/org/objectweb/asm/ClassWriter.class
com/mebigfatguy/org/objectweb/asm/Context.class
com/mebigfatguy/org/objectweb/asm/Edge.class
com/mebigfatguy/org/objectweb/asm/FieldVisitor.class
com/mebigfatguy/org/objectweb/asm/FieldWriter.class
com/mebigfatguy/org/objectweb/asm/Frame.class
com/mebigfatguy/org/objectweb/asm/Handle.class
com/mebigfatguy/org/objectweb/asm/Handler.class
com/mebigfatguy/org/objectweb/asm/Item.class
com/mebigfatguy/org/objectweb/asm/Label.class
com/mebigfatguy/org/objectweb/asm/MethodVisitor.class
com/mebigfatguy/org/objectweb/asm/MethodWriter.class
com/mebigfatguy/org/objectweb/asm/Opcodes.class
com/mebigfatguy/org/objectweb/asm/Type.class
com/mebigfatguy/org/objectweb/asm/TypePath.class
com/mebigfatguy/org/objectweb/asm/TypeReference.class
com/mebigfatguy/org/objectweb/asm/signature/
com/mebigfatguy/org/objectweb/asm/signature/SignatureReader.class
com/mebigfatguy/org/objectweb/asm/signature/SignatureVisitor.class
com/mebigfatguy/org/objectweb/asm/signature/SignatureWriter.class
如你所见,任务class就在那里
我把罐子放在 ~/.ant/lib 中,当我尝试 运行 一个像这样引用它的任务时:
<target name="literals" xmlns:stringliterals="antlib:com.mebigfatguy.stringliterals" description="generate report of string literals used in code">
<stringliterals:stringliterals>
<classpath refid="fb-contrib.classpath"/>
</stringliterals:stringliterals>
</target>
我明白了
文字:
parsing buildfile jar:file:/home/dave/.ant/lib/stringliterals-0.2.0.jar!/com/mebigfatguy/stringliterals/antlib.xml with URI = jar:file:/home/dave/.ant/lib/stringliterals-0.2.0.jar!/com/mebigfatguy/stringliterals/antlib.xml from a zip file
Finding class com.mebigfatguy.stringliterals.StringLiteralsTask
BUILD FAILED
/home/dave/dev/fb-contrib/build.xml:245: The following error occurred while executing this line:
jar:file:/home/dave/.ant/lib/stringliterals-0.2.0.jar!/com/mebigfatguy/stringliterals/antlib.xml:2: taskdef class com.mebigfatguy.stringliterals.StringLiteralsTask cannot be found
using the classloader AntClassLoader[]
at org.apache.tools.ant.taskdefs.Definer.addDefinition(Definer.java:607)
at org.apache.tools.ant.taskdefs.Definer.execute(Definer.java:237)
at org.apache.tools.ant.taskdefs.Antlib.execute(Antlib.java:177)
at org.apache.tools.ant.taskdefs.Definer.loadAntlib(Definer.java:428)
at org.apache.tools.ant.taskdefs.Definer.execute(Definer.java:277)
at org.apache.tools.ant.ComponentHelper.checkNamespace(ComponentHelper.java:874)
at org.apache.tools.ant.ComponentHelper.getDefinition(ComponentHelper.java:307)
at org.apache.tools.ant.ComponentHelper.createComponent(ComponentHelper.java:284)
at org.apache.tools.ant.ComponentHelper.createComponent(ComponentHelper.java:263)
at org.apache.tools.ant.UnknownElement.makeObject(UnknownElement.java:429)
at org.apache.tools.ant.UnknownElement.maybeConfigure(UnknownElement.java:163)
at org.apache.tools.ant.Task.perform(Task.java:347)
at org.apache.tools.ant.Target.execute(Target.java:435)
at org.apache.tools.ant.Target.performTasks(Target.java:456)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
at org.apache.tools.ant.Project.executeTarget(Project.java:1364)
at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1248)
at org.apache.tools.ant.Main.runBuild(Main.java:851)
at org.apache.tools.ant.Main.startAnt(Main.java:235)
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
Caused by: java.lang.ClassNotFoundException: com.mebigfatguy.stringliterals.StringLiteralsTask
at org.apache.tools.ant.AntClassLoader.findClassInComponents(AntClassLoader.java:1366)
at org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:1315)
at org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:1068)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.tools.ant.taskdefs.Definer.addDefinition(Definer.java:579)
... 21 more
我以前做过几次都没有问题,但是这次我看不出哪里出错了。有什么方法可以调试此 class 加载程序问题?
GitHub 项目在这里 https://github.com/mebigfatguy/stringliterals
问题原来是清单文件格式不正确。抱歉!
我有一个 jar,里面有一个 ant 任务。我的com/mebigfatguy/stringliterals/antlib.xml是
<antlib xmlns:stringliterals="ant:com.mebigfatguy.stringliterals">
<taskdef name="stringliterals" classname="com.mebigfatguy.stringliterals.StringLiteralsTask"/>
</antlib>
运行ning jar tf stringliterals.jar 我得到
META-INF/
META-INF/MANIFEST.MF
com/
com/mebigfatguy/
com/mebigfatguy/stringliterals/
com/mebigfatguy/stringliterals/antlib.xml
com/mebigfatguy/stringliterals/SLClassVisitor.class
com/mebigfatguy/stringliterals/StringLiteralsTask.class
com/mebigfatguy/stringliterals/SLMethodVisitor.class
com/mebigfatguy/stringliterals/Literal.class
META-INF/maven/
META-INF/maven/com.mebigfatguy.stringliterals/
META-INF/maven/com.mebigfatguy.stringliterals/stringliterals/
META-INF/maven/com.mebigfatguy.stringliterals/stringliterals/pom.xml
META-INF/maven/com.mebigfatguy.stringliterals/stringliterals/pom.properties
com/mebigfatguy/org/
com/mebigfatguy/org/objectweb/
com/mebigfatguy/org/objectweb/asm/
com/mebigfatguy/org/objectweb/asm/AnnotationVisitor.class
com/mebigfatguy/org/objectweb/asm/AnnotationWriter.class
com/mebigfatguy/org/objectweb/asm/Attribute.class
com/mebigfatguy/org/objectweb/asm/ByteVector.class
com/mebigfatguy/org/objectweb/asm/ClassReader.class
com/mebigfatguy/org/objectweb/asm/ClassVisitor.class
com/mebigfatguy/org/objectweb/asm/ClassWriter.class
com/mebigfatguy/org/objectweb/asm/Context.class
com/mebigfatguy/org/objectweb/asm/Edge.class
com/mebigfatguy/org/objectweb/asm/FieldVisitor.class
com/mebigfatguy/org/objectweb/asm/FieldWriter.class
com/mebigfatguy/org/objectweb/asm/Frame.class
com/mebigfatguy/org/objectweb/asm/Handle.class
com/mebigfatguy/org/objectweb/asm/Handler.class
com/mebigfatguy/org/objectweb/asm/Item.class
com/mebigfatguy/org/objectweb/asm/Label.class
com/mebigfatguy/org/objectweb/asm/MethodVisitor.class
com/mebigfatguy/org/objectweb/asm/MethodWriter.class
com/mebigfatguy/org/objectweb/asm/Opcodes.class
com/mebigfatguy/org/objectweb/asm/Type.class
com/mebigfatguy/org/objectweb/asm/TypePath.class
com/mebigfatguy/org/objectweb/asm/TypeReference.class
com/mebigfatguy/org/objectweb/asm/signature/
com/mebigfatguy/org/objectweb/asm/signature/SignatureReader.class
com/mebigfatguy/org/objectweb/asm/signature/SignatureVisitor.class
com/mebigfatguy/org/objectweb/asm/signature/SignatureWriter.class
如你所见,任务class就在那里
我把罐子放在 ~/.ant/lib 中,当我尝试 运行 一个像这样引用它的任务时:
<target name="literals" xmlns:stringliterals="antlib:com.mebigfatguy.stringliterals" description="generate report of string literals used in code">
<stringliterals:stringliterals>
<classpath refid="fb-contrib.classpath"/>
</stringliterals:stringliterals>
</target>
我明白了
文字:
parsing buildfile jar:file:/home/dave/.ant/lib/stringliterals-0.2.0.jar!/com/mebigfatguy/stringliterals/antlib.xml with URI = jar:file:/home/dave/.ant/lib/stringliterals-0.2.0.jar!/com/mebigfatguy/stringliterals/antlib.xml from a zip file Finding class com.mebigfatguy.stringliterals.StringLiteralsTask
BUILD FAILED /home/dave/dev/fb-contrib/build.xml:245: The following error occurred while executing this line: jar:file:/home/dave/.ant/lib/stringliterals-0.2.0.jar!/com/mebigfatguy/stringliterals/antlib.xml:2: taskdef class com.mebigfatguy.stringliterals.StringLiteralsTask cannot be found using the classloader AntClassLoader[] at org.apache.tools.ant.taskdefs.Definer.addDefinition(Definer.java:607) at org.apache.tools.ant.taskdefs.Definer.execute(Definer.java:237) at org.apache.tools.ant.taskdefs.Antlib.execute(Antlib.java:177) at org.apache.tools.ant.taskdefs.Definer.loadAntlib(Definer.java:428) at org.apache.tools.ant.taskdefs.Definer.execute(Definer.java:277) at org.apache.tools.ant.ComponentHelper.checkNamespace(ComponentHelper.java:874) at org.apache.tools.ant.ComponentHelper.getDefinition(ComponentHelper.java:307) at org.apache.tools.ant.ComponentHelper.createComponent(ComponentHelper.java:284) at org.apache.tools.ant.ComponentHelper.createComponent(ComponentHelper.java:263) at org.apache.tools.ant.UnknownElement.makeObject(UnknownElement.java:429) at org.apache.tools.ant.UnknownElement.maybeConfigure(UnknownElement.java:163) at org.apache.tools.ant.Task.perform(Task.java:347) at org.apache.tools.ant.Target.execute(Target.java:435) at org.apache.tools.ant.Target.performTasks(Target.java:456) at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393) at org.apache.tools.ant.Project.executeTarget(Project.java:1364) at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) at org.apache.tools.ant.Project.executeTargets(Project.java:1248) at org.apache.tools.ant.Main.runBuild(Main.java:851) at org.apache.tools.ant.Main.startAnt(Main.java:235) at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280) at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109) Caused by: java.lang.ClassNotFoundException: com.mebigfatguy.stringliterals.StringLiteralsTask at org.apache.tools.ant.AntClassLoader.findClassInComponents(AntClassLoader.java:1366) at org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:1315) at org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:1068) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at org.apache.tools.ant.taskdefs.Definer.addDefinition(Definer.java:579) ... 21 more
我以前做过几次都没有问题,但是这次我看不出哪里出错了。有什么方法可以调试此 class 加载程序问题?
GitHub 项目在这里 https://github.com/mebigfatguy/stringliterals
问题原来是清单文件格式不正确。抱歉!