0

我正在尝试在我的 android 项目中使用以下内容从 asn1 文件生成 java 文件,并且在 Mac OS 和窗口中生成文件时遇到错误,它工作正常。

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

下面是bash文件

#!/bin/bash

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

SCRIPT_HOME=`dirname $0`

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文件中有主类。同样在 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

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

4

1 回答 1

2

最后我找到了答案。该错误是由于 Mac 中的 Java 版本而发生的,它具有 Java 11 并且不支持 javax xml 绑定。所以我在 mac 机器上安装了 JDK 1.8,并在 bash 文件中的 java 执行行之前使用 bash 文件中的该路径,如下所示。

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

它可能对某人有用。

于 2021-09-01T09:39:41.467 回答