JavaCard Ant构建引入外部JAR报错:cap不支持classpath嵌套元素
问题:Ant构建JavaCard项目时引入外部JAR报错
错误信息
cap doesn't support the nested "classpath" element.
当前build.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project name="TEST-Applet" default="build-cap" basedir="."> <get src="https://github.com/martinpaljak/ant-javacard/releases/download/v23.08.29/ant-javacard.jar" dest="." skipexisting="true"/> <taskdef name="javacard" classname="pro.javacard.ant.JavaCard" classpath="ant-javacard.jar"/> <property name="src.dir" value="src"/> <property name="build.dir" value="build"/> <property name="target.dir" value="target"/> <property name="test.dir" value="testing"/> <property name="jc.sdk.kit" value="../jc_sdks/jc310r20210706_kit"/> <property name="jc.sdk.target" value="3.0.5"/> <property name="test_info.jar" value="src/com/info/otherapplet/test_info.jar"/> <property name="pkg.ver" value="2.0"/> <property name="pkg.aid" value="XX:00:00:00:00"/> <property name="applet.version" value="2.0.0"/> <property name="applet.aid" value="XX:00:00:00:00"/> <property name="applet.artifact" value="test-applet.cap"/> <property name="applet.class" value="com.test.testapplet.TestApplet"/> <target name="clean" description="Clean up build artifacts (*.class, *.cap)"> <delete failonerror="false"> <fileset dir="${build.dir}" includes="**"/> <fileset dir="${target.dir}" includes="**/*.cap"/> </delete> </target> <target name="copy-src-to-build"> <mkdir dir="${build.dir}"/> <delete includeEmptyDirs="true"> <fileset dir="${build.dir}" includes="**"/> </delete> <copy todir="${build.dir}/src"> <fileset dir="${src.dir}"> <include name="**"/> </fileset> </copy> </target> <target name="inject-git-version" depends="copy-src-to-build"> . . </target> <description>Builds the project.</description> <target name="build-cap" description="Generate applet artifact (CAP file)" depends="inject-git-version"> <tstamp/> <mkdir dir="${target.dir}"/> <javacard jckit="${jc.sdk.kit}"> <cap targetsdk="${jc.sdk.target}" aid="${pkg.aid}" version="${pkg.ver}" sources="${build.dir}" output="${target.dir}/${applet.artifact}"> <applet class="${applet.class}" aid="${applet.aid}"/> <classpath> <pathelement path="${test_info.jar}"/> <!-- Include the JAR in the classpath --> </classpath> </cap> </javacard> </target> </project>
项目目录结构
project_root │ └───src │ │ com │ | │ info | | | | otherapplet │ | │ | | test_info.jar | | | | | TestApplet.java | | | | | Version.java │ ant-javacard.jar | build.xml | README.md
解决方案
ant-javacard的<cap>元素不支持嵌套<classpath>,正确做法是将外部JAR配置到<javacard>任务层级的classpath中,有两种实现方式:
方式1:使用预定义路径引用
在项目根节点下添加路径定义:
<path id="external.libs"> <pathelement location="${test_info.jar}"/> </path>
然后修改<javacard>任务,通过classpathref引用该路径:
<javacard jckit="${jc.sdk.kit}" classpathref="external.libs"> <cap targetsdk="${jc.sdk.target}" aid="${pkg.aid}" version="${pkg.ver}" sources="${build.dir}" output="${target.dir}/${applet.artifact}"> <applet class="${applet.class}" aid="${applet.aid}"/> </cap> </javacard>
方式2:直接在<javacard>下嵌套<classpath>
无需预定义路径,直接将<classpath>放到<javacard>内部:
<javacard jckit="${jc.sdk.kit}"> <classpath> <pathelement path="${test_info.jar}"/> </classpath> <cap targetsdk="${jc.sdk.target}" aid="${pkg.aid}" version="${pkg.ver}" sources="${build.dir}" output="${target.dir}/${applet.artifact}"> <applet class="${applet.class}" aid="${applet.aid}"/> </cap> </javacard>
额外注意事项
- 确认
test_info.jar的路径配置正确,当前路径与目录结构匹配,无需调整; - 确保JAR内的JavaCard类符合目标SDK版本(3.0.5)的规范,避免兼容性问题。
内容的提问来源于stack exchange,提问作者Preeti
相关产品推荐
相关产品推荐

