d+java.ext.dirs_Java-JDK9-Djava.ext.dirs is not supported

1.JDK9出现的问题

去年JDK9发布了, 最近我把JDK8更新为JDK9后, 当我使用 Android apksigner dx 命令工具出现如下问题

D:\Dev\AndroidSDK\build-tools\27.0.3>apksigner

-Djava.ext.dirs=D:\Dev\AndroidSDK\build-tools\27.0.3\lib is not supported. Use -classpath instead.

Error: Could not create the Java Virtual Machine.

Error: A fatal exception has occurred. Program will exit.

D:\Dev\AndroidSDK\build-tools\27.0.3>dx

-Djava.ext.dirs=D:\Dev\AndroidSDK\build-tools\27.0.3\lib is not supported. Use -classpath instead.

Error: Could not create the Java Virtual Machine.

Error: A fatal exception has occurred. Program will exit.

-Djava.ext.dirs 和 -classpath 都是指定需要加载的jar/class文件目录路径,

按错误提示猜测应该是JDK9不再支持-Djava.ext.dirs参数,之前的JDK8可以正常支持。

于是按错误提示尝试把 -Djava.ext.dirs 替换为 -classpath

在 D:\Dev\AndroidSDK\build-tools\27.0.3\apksigner.bat 批处理文件中修改如下:

REM call "%java_exe%" %javaOpts% -Djava.ext.dirs="%frameworkdir%" -jar "%jarpath%" %params%

call "%java_exe%" %javaOpts% -classpath="%frameworkdir%" -jar "%jarpath%" %params%

结果我还是太天真了,JDK9花式给了一个同样的错误

D:\Dev\AndroidSDK\build-tools\27.0.3>apksigner

Unrecognized option: -classpath=D:\Dev\AndroidSDK\build-tools\27.0.3\lib

Error: Could not create the Java Virtual Machine.

Error: A fatal exception has occurred. Program will exit.

2.解决方法

Unrecognized option: -classpath

既然JDK9装做不认识-classpath, 那我只好尝试看看java命令有什么新option

D:\>java

用法: java [options] [args...]

(执行类)

或 java [options] -jar [args...]

(执行 jar 文件)

或 java [options] -m [/] [args...]

java [options] --module [/] [args...]

(执行模块中的主类)

其中, 选项包括:

-d32 已过时, 在以后的发行版中将被删除

-d64 已过时, 在以后的发行版中将被删除

-cp

-classpath

--class-path

使用 ; 分隔的, 用于搜索类文件的目录, JAR 档案

和 ZIP 档案列表。

果然JDK9新增命令选项 --class-path, 也是用来指定class/jar文件目录路径

在 D:\Dev\AndroidSDK\build-tools\27.0.3\apksigner.bat 批处理文件中修改如下:

REM call "%java_exe%" %javaOpts% -Djava.ext.dirs="%frameworkdir%" -jar "%jarpath%" %params%

call "%java_exe%" %javaOpts% --class-path="%frameworkdir%" -jar "%jarpath%" %params%

终于成功了

D:\Dev\AndroidSDK\build-tools\27.0.3>apksigner

USAGE: apksigner [options]

apksigner --version

apksigner --help

EXAMPLE:

apksigner sign --ks release.jks app.apk

apksigner verify --verbose app.apk

apksigner is a tool for signing Android APK files and for checking whether

signatures of APK files will verify on Android devices.

刚开始出现问题时,因为畏惧这种系统问题而粗暴滚回JDK8,还好后来强迫症犯了,误打误撞终于找到原因…

“提出问题比解决问题更重要”,我对这句话越来越有感触了…

出现了问题,应该感到庆幸而不是畏惧,因为这个新问题会带来新知识,因畏惧而逃避的人将永远无知!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java -djava.ext.dirs和--class-path是两个Java的命令行选项,都用于指定Java虚拟机运行时查找类文件的路径。 Java的类库是由许多Java类文件组成的,这些类文件需要被Java虚拟机加载并执行。当我们编写Java程序时,我们需要通过某种方式告知Java虚拟机去哪里查找这些类文件。 -djava.ext.dirs选项用于指定Java虚拟机搜索Java扩展(Java Extension)类库的路径。Java扩展类库是指Java虚拟机内置的一些功能库,比如Java Database Connectivity(JDBC)类库,Java Naming and Directory Interface(JNDI)类库等。Java扩展类库通常存放在JRE的ext文件夹中,但是有时候我们可能需要自己定义一些Java扩展类库,那么就需要使用-djava.ext.dirs选项来告知Java虚拟机去哪里查找这些类文件。 --class-path选项用于指定Java虚拟机搜索Java应用程序类库的路径。Java应用程序类库是指我们编写的Java程序所依赖的一些类库,比如在编写Spring框架的应用程序时需要依赖Spring框架的类库。在编写Java应用程序时,我们需要告知Java虚拟机去哪里查找这些类库,那么就需要使用--class-path选项来指定Java应用程序类库的路径。 综上所述,Java -djava.ext.dirs和--class-path选项都用于指定Java虚拟机运行时查找类文件的路径,但是-djava.ext.dirs选项用于指定Java扩展类库的路径,而--class-path选项用于指定Java应用程序类库的路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值