Android 中 Bash 文件的 ASN1 编译问题

ASN1 Compile issue with Bash file in Android

我正在尝试在我的 android 项目中使用以下内容从 asn1 文件生成 java 文件,但在 Mac OS 和 Mac 中生成文件时遇到错误window 效果很好。

org.openmuc:jasn1:1.9.0
org.openmuc:jasn1-compiler:1.9.0

下面是bash file

#!/bin/bash

JARS_LOCATION="../build/libs-all"
MAIN_CLASS="org.openmuc.jasn1.compiler.Compiler"
SYSPROPS=""
PARAMS=""

SCRIPT_HOME=`dirname [=13=]`

CLASSPATH=$(JARS=("$SCRIPT_HOME"/"$JARS_LOCATION"/*.jar); IFS=:; echo "${JARS[*]}")

for i in $@; do 
    if [[ $i == -D* ]]; then
        SYSPROPS="$SYSPROPS $i";
    else
        PARAMS="$PARAMS $i";
    fi
done

java $SYSPROPS -cp $CLASSPATH $MAIN_CLASS $PARAMS

和上面的 bash 文件将从我的项目 build.gradle 文件中调用。 下面是将从 bash 开始执行的最终命令。缩短了文件路径以便于理解。

java -cp "/libs/antlr-2.7.7.jar:/libs/jasn1-1.9.0.jar:/libs/jasn1-compiler-1.9.0.jar" org.openmuc.jasn1.compiler.Compiler -p com.test.package.asn1 -f /asn1def/asn1/RSPDefinition.asn /asn1def/asn1/PKIX1Explicit88.asn /asn1def/asn1/PKIX1Implicit88.asn -o /asn1def/build/generated/source/java

下面是我遇到的错误

Generated code will be saved in /asn1def/build/generated/source/java
    Parsing "/asn1def/asn1/RSPDefinition.asn"
    Parsing "/asn1def/asn1/PKIX1Explicit88.asn"
    Parsing "/asn1def/asn1/PKIX1Implicit88.asn"
    Generating classes for module "PKIX1Implicit88"
    Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
            at org.openmuc.jasn1.compiler.HexConverter.toShortHexString(HexConverter.java:63)
            at org.openmuc.jasn1.compiler.HexConverter.toShortHexString(HexConverter.java:59)
            at org.openmuc.jasn1.compiler.HexConverter.appendShortHexString(HexConverter.java:99)
            at org.openmuc.jasn1.compiler.HexConverter.appendHexString(HexConverter.java:108)
            at org.openmuc.jasn1.compiler.HexConverter.toHexString(HexConverter.java:9)
            at org.openmuc.jasn1.compiler.BerClassWriter.writeEncodeTag(BerClassWriter.java:2169)
            at org.openmuc.jasn1.compiler.BerClassWriter.writeSequenceOrSetEncodeFunction(BerClassWriter.java:1107)
            at org.openmuc.jasn1.compiler.BerClassWriter.writeSequenceOrSetClass(BerClassWriter.java:731)
            at org.openmuc.jasn1.compiler.BerClassWriter.writeConstructedTypeClass(BerClassWriter.java:493)
            at org.openmuc.jasn1.compiler.BerClassWriter.translateModule(BerClassWriter.java:194)
            at org.openmuc.jasn1.compiler.BerClassWriter.translate(BerClassWriter.java:133)
            at org.openmuc.jasn1.compiler.Compiler.main(Compiler.java:89)
    Caused by: java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter
            at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
            at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
            at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
            ... 12 more
    
    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Execution failed for task ':asn1def:compileAsn'.
    > Process 'command '/asn1def/run-scripts/jasn1-compiler'' finished with non-zero exit value 1

我在 libs 文件夹的 jasn1-compiler-1.9.0.jar 文件中有主要的 class。在 windows 中生成相同的文件,但在 Mac 中它不起作用。 windows 和 Mac 的区别是 Java 版本。 Mac 有 Java 11 & windows 有 Java 1.8。我还尝试在上面的代码末尾添加 JDK 1.8 位置,如下所示。

-Dorg.gradle.java.home=/Users/Shared/Jenkins/.jenkins/tools/hudson.model.JDK/JDK_1_8

谁能帮我指出遗漏了什么?

终于找到答案了。发生错误是因为 Mac 中的 Java 版本,它有 Java 11 并且不支持 javax xml 绑定。所以我在 mac machine 中安装了 JDK 1.8,并在 bash 文件中的 java 执行行之前使用该路径,如下所示=] 文件.

export JAVA_HOME=/usr/java/jdk1.8.161/

可能对某些人有用。