Android项目通过Bash调用jasn1编译ASN1文件Mac下报错求助
问题根因
你遇到的报错核心原因是Java 9及以上版本移除了原JDK内置的JAXB(Java Architecture for XML Binding)相关类库,你用的jasn1-compiler 1.9.0版本依赖Java 8内置的javax.xml.bind.DatatypeConverter类,Mac环境默认调用Java 11运行脚本时就会触发类不存在的错误。
你之前配置的-Dorg.gradle.java.home参数不生效,是因为这个参数仅控制Gradle自身运行使用的JDK版本,不会影响你在构建逻辑中调用的bash脚本里的java命令——脚本里直接调用的是系统PATH环境变量中默认的java(也就是你的Java 11),所以指定Gradle的JDK路径不会作用到ASN1编译流程上。
可行解决方案
方案1:修改bash脚本指定使用JDK 8运行
直接修改你的jasn1编译bash脚本,把java命令替换为你本地JDK 8的绝对路径即可,示例修改如下:
#!/bin/bash # 新增:指定JDK8路径,直接用你之前配置的路径即可 JAVA_8_HOME="/Users/Shared/Jenkins/.jenkins/tools/hudson.model.JDK/JDK_1_8" 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替换成JDK8下的java绝对路径 "$JAVA_8_HOME/bin/java" $SYSPROPS -cp $CLASSPATH $MAIN_CLASS $PARAMS
方案2:不切换JDK版本,补充缺失的JAXB依赖
如果不想强制指定JDK 8运行,可以把JAXB相关的依赖包添加到你的libs目录下,补全缺失的类即可,需要添加的依赖如下:
- javax.xml.bind:jaxb-api:2.3.1
- com.sun.xml.bind:jaxb-impl:2.3.1
- com.sun.xml.bind:jaxb-core:2.3.1
- javax.activation:activation:1.1.1
把上述4个jar包放入你脚本读取的../build/libs-all目录后,Java 11环境下也能正常运行编译。
内容的提问来源于stack exchange,提问作者Prabhakaran
相关产品推荐
相关产品推荐

