Class files copied into cap file at wrong location
CardContact opened this issue · 2 comments
When creating a cap file from classes, then class files are copied into the cap to the wrong location.
<!-- Extract class files for biometry interface and create .cap file -->
<unjar src="${basedir}/${jcsdk}/lib/api_classic.jar" dest="${class.folder}">
<patternset>
<include name="javacardx/biometry/*.class" />
</patternset>
</unjar>
<javacard jckit="${jcsdk}">
<cap aid="A0000000620202" package="javacardx.biometry" classes="${class.folder}" output="${release.folder}/biometry.cap" version="1.3" verify="false" />
</javacard>
creates a cap file with
Archive: biometry.cap
Length Date Time Name
--------- ---------- ----- ----
808 2021-02-22 17:42 META-INF/MANIFEST.MF
20 2021-02-22 17:42 javacardx/biometry/javacard/Header.cap
34 2021-02-22 17:42 javacardx/biometry/javacard/Directory.cap
24 2021-02-22 17:42 javacardx/biometry/javacard/Import.cap
13 2021-02-22 17:42 javacardx/biometry/javacard/ConstantPool.cap
32 2021-02-22 17:42 javacardx/biometry/javacard/Class.cap
30 2021-02-22 17:42 javacardx/biometry/javacard/Method.cap
13 2021-02-22 17:42 javacardx/biometry/javacard/StaticField.cap
9 2021-02-22 17:42 javacardx/biometry/javacard/RefLocation.cap
32 2021-02-22 17:42 javacardx/biometry/javacard/Export.cap
521 2021-02-22 17:42 javacardx/biometry/javacard/Descriptor.cap
535 2021-02-22 17:42 META-INF/javacard.xml
1108 2021-02-22 17:42 javacardx/biometry/BioBuilder.class
448 2021-02-22 17:42 javacardx/biometry/BioException.class
529 2021-02-22 17:42 javacardx/biometry/BioTemplate.class
325 2021-02-22 17:42 javacardx/biometry/OwnerBioTemplate.class
162 2021-02-22 17:42 javacardx/biometry/SharedBioTemplate.class
--------- -------
4643 17 files
If stored in the cap, class files should be located in APPLET-INF/classes
Could you elaborate? class files are copied to the .cap file by apple converter, under APPLET-INF/classes, for example:
$ jar tvf tests/Empty_0102030405_8d5ac9e2_2.2.1.cap
991 Mon Mar 08 06:55:26 EET 2021 META-INF/MANIFEST.MF
18 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/Header.cap
34 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/Directory.cap
15 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/Applet.cap
34 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/Import.cap
25 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/ConstantPool.cap
15 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/Class.cap
45 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/Method.cap
13 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/StaticField.cap
12 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/RefLocation.cap
72 Mon Mar 08 06:55:26 EET 2021 testapplets/empty/javacard/Descriptor.cap
313 Mon Mar 08 06:55:26 EET 2021 META-INF/javacard.xml
518 Mon Mar 08 06:55:26 EET 2021 APPLET-INF/applet.xml
801 Mon Mar 08 06:55:26 EET 2021 APPLET-INF/classes/testapplets/empty/Empty.class
Except for a library package, when classes are in root
$ jar tvf testapplets.library_01020304050607_be670770_2.2.2.cap
799 Mon Mar 08 06:55:16 EET 2021 META-INF/MANIFEST.MF
20 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/Header.cap
34 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/Directory.cap
24 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/Import.cap
13 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/ConstantPool.cap
13 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/Class.cap
32 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/Method.cap
13 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/StaticField.cap
9 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/RefLocation.cap
14 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/Export.cap
67 Mon Mar 08 06:55:16 EET 2021 testapplets/library/javacard/Descriptor.cap
313 Mon Mar 08 06:55:16 EET 2021 META-INF/javacard.xml
685 Mon Mar 08 06:55:16 EET 2021 testapplets/library/SomeLibrary.class
Run "ant test" from master branch to verify this.
I can't find the difference between a "normal" cap and a library cap anywhere in the jcvm specification.
Anyway, if you say that this is the default behavior of the cap converter, then I'm fine with it. I was just puzzled because our previous build system using the ant tasks from the jcdk produces cap files without classes.