常用jdk工具包测试结果汇总¶
测试环境 qem8.0 riscv OpenEuler23.03,√表示测试通过
| openjdk1.8.0 | openjdk11 | ||
|---|---|---|---|
| 1 | jaotc | openjdk1.8.0中无jaotc工具 | 未实现aot功能 |
| 2 | jarsigner | √ | √ |
| 3 | javac | √ | √ |
| 4 | javap | √ | √ |
| 5 | jconsole | nan | nan |
| 6 | jdeprscan | openjdk 1.8中无jdeprscan工具 | √ |
| 7 | jfr | openjdk 1.8.0中无jfr工具 | √ |
| 8 | jimage | openjdk1.8.0无jimage工具 | √ |
| 9 | jjs | √ | √ |
| 10 | jmap | √ | √ |
| 11 | jps | √ | √ |
| 12 | jshell | openjdk1.8.0无jshell工具 | √ |
| 13 | jstat | √ | √ |
| 14 | keytool | √ | √ |
| 15 | rmic | √ | √ |
| 16 | rmiregistry | √ | √ |
| 17 | unpack200 | √ | √ |
测试详情¶
jarsigner¶
openjdk11¶
Jarsigner是Java开发工具包(JDK)中的一个实用程序,用于对Java归档文件(JAR文件)进行数字签名和验证。数字签名是一种安全措施,用于确认JAR文件的来源和完整性,以及确保它们在传输或分发过程中没有被篡改。
- 准备密钥库(Keystore)
首先,需要创建一个密钥库(Keystore),其中包含数字证书和私钥。如果没有现成的密钥库,可以使用Java提供的keytool工具来生成一个新的密钥库。以下是生成密钥库的示例命令:
keytool -genkeypair -alias myalias -keyalg RSA -keysize 2048 -keystore mykeystore.jks
在执行此命令后,系统将提示输入有关密钥库和证书的详细信息,例如密码、组织、城市等。完成后,将生成一个名为mykeystore.jks的密钥库文件。

- 使用Jarsigner签名JAR文件
一旦有了密钥库,就可以使用Jarsigner来签署您的JAR文件。以下是签署JAR文件的示例命令:
jarsigner -keystore mykeystore.jks -storepass keystorepassword -keypass keypassword test.jar myalias
密码已打马赛克。

- 验证签名
可以使用Jarsigner验证已签名的JAR文件,以确保它的完整性和来源。以下是验证签名的示例命令:
jarsigner -verify -keystore mykeystore.jks -storepass hz19981004 test.jar
输入错误的密码,验证失败。输入正确的密码,验证成功。

openjdk1.8.0¶
测试方法与上述一致,验证通过

note:
查看jdk安装目录, 切换jdk版本的方法:
sudo update-alternatives --config java
Selection Command
-----------------------------------------------
1 java-11-openjdk.riscv64 (/usr/lib/jvm/java-11-openjdk-11.0.11.9-9.oe2303.riscv64/bin/java)
*+ 2 java-1.8.0-openjdk.riscv64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-5.oe2303.riscv64/jre/bin/java)
Enter to keep the current selection[+], or type selection number:2
javac¶
openjdk1.8/11均可正常运行
openjdk 11¶

openjdk 1.8.0¶

javap¶
openjdk1.8/11均可正常运行
openjdk 11¶

openjdk 1.8.0¶

jconsole¶
JConsole(Java Monitoring and Management Console)是Java开发工具包(JDK)中的一个监控和管理工具,用于监视和管理Java虚拟机(JVM)和Java应用程序的性能和行为。
openjdk 11¶
jconsole -interval=1000 -notile 2414
jdeprscan¶
jdeprscan 是 JDK 9 引入的一个命令行工具,用于扫描 Java 应用程序的类、JAR 文件或模块,并识别其中使用的已弃用 API(Deprecated API)。它的目的是帮助开发人员在迁移至新版本的 JDK 时发现和处理已弃用的 API,以便更轻松地升级应用程序。
jdeprscan test.jar
openjdk11正常运行

openjdk 1.8.0中无jdeprscan工具

jfr¶
JFR(Java Flight Recorder)是 Java 虚拟机(JVM)中的一个事件记录器,用于实时监控和收集 JVM 运行时的各种事件和数据,可以用于诊断和分析 Java 应用程序的性能问题、内存问题以及其他运行时行为。
java -XX:+FlightRecorder -XX:StartFlightRecording=disk=true,dumponexit=true,filename=myrecording.jfr binarytrees 18
openjdk11正常运行

openjdk 1.8.0中无jfr工具

jimage¶
jimage 是 JDK 9 引入的一个新工具,用于处理和操作 Java 平台模块图像文件(JImage files)。它提供了一种方式来查看、检查和操作 JDK 的模块图像文件,这些文件包含了 JDK 的核心类库、可执行文件和其他资源。
openjdk11 jimage测试正常

jjs¶
jjs 是 JDK 自带的一个命令行工具,它提供了一个交互式的 JavaScript 执行环境,可以让您在命令行中直接执行 JavaScript 代码,类似于 Python 的交互式解释器。
编写一个简单的js程序test.js:
// 定义一个函数来计算阶乘
function factorial(n) {
if (n === 0 || n === 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
// 计算并打印阶乘
var num = 5;
print("Factorial of " + num + " is: " + factorial(num));
openjdk 11¶
验证jjs,openjdk11验证正常
jjs test.js

openjdk 1.8.0¶
openjdk1.8.0验证正常
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-5.oe2303.riscv64/bin/jjs test.js

jmap¶
jmap 是 JDK 自带的一个命令行工具,用于生成 Java 进程的内存映像文件(Memory Dump),以及查看 Java 进程的堆内存使用情况和类统计信息等。它提供了一种方式来诊断和分析 Java 应用程序的内存使用情况,帮助开发人员发现内存泄漏、性能问题等。
jmap测试正常
openjdk 11¶

openjdk 1.8.0¶

jps¶
jps验证正常
openjdk 11¶
openjdk 1.8.0¶

jshell¶
openjdk11 jshell验证正常

java9 引入jshell, openjdk1.8.0无jshell工具
jstat¶
jstat 是 JDK 自带的一个命令行工具,用于监视和输出 Java 虚拟机(JVM)的各种运行时统计信息。它可以用于实时监控 JVM 的堆内存、垃圾回收、类加载、编译等情况,帮助开发人员了解和分析 Java 应用程序的性能特征和行为。
openjdk 11¶
jstat -gc 1258 10 10
openjdk 11 jstat验证正常。

openjdk 1.8.0¶
openjdk 1.8.0 jstat验证正常。

keytool¶
keytool 是 Java 开发工具包(JDK)中的一个命令行实用程序,用于管理 Java 密钥和证书,以及执行与密钥和证书相关的操作。
创建一个密钥库(Keystore),其中包含数字证书和私钥。如果没有现成的密钥库,可以使用Java提供的keytool工具来生成一个新的密钥库。以下是生成密钥库的示例命令:
keytool -genkeypair -alias myalias -keyalg RSA -keysize 2048 -keystore mykeystore.jks
在执行此命令后,系统将提示输入有关密钥库和证书的详细信息,例如密码、组织、城市等。完成后,将生成一个名为mykeystore.jks的密钥库文件。
openjdk 11¶
openjdk 11 keytool验证正常。

openjdk 1.8.0¶
openjdk 1.8.0 keytool验证正常。

rmic¶
rmic 是 JDK 中的一个命令行工具,用于生成远程对象的 stub 和 skeleton 类。在 Java RMI(远程方法调用)中,客户端和服务器之间通信的对象需要有 stub 和 skeleton。Stub 位于客户端,Skeleton 位于服务器端,它们协同工作以实现远程方法的调用和通信。
openjdk 11¶
-
创建远程接口:
import java.rmi.Remote; import java.rmi.RemoteException;
public interface RemoteInterface extends Remote { String sayHello() throws RemoteException; }
-
实现远程接口:
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject;
public class RemoteImplementation extends UnicastRemoteObject implements RemoteInterface { public RemoteImplementation() throws RemoteException { super(); }
public String sayHello() throws RemoteException { return "Hello from the remote server!"; }}
-
生成存根和骨架类:
rmic RemoteImplementation
这将生成RemoteImplementation_Stub.class和RemoteImplementation_Skel.class:

-
启动RMI注册表:
import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry;
public class RMIRegistry { public static void main(String[] args) throws Exception { Registry registry = LocateRegistry.createRegistry(1099); System.out.println("RMI Registry started."); } }
-
启动RMI服务器:
import java.rmi.Naming; import java.rmi.RemoteException;
public class RMIServer { public static void main(String[] args) throws Exception { RMIRegistry.main(args);
RemoteImplementation remoteObj = new RemoteImplementation(); Naming.rebind("RemoteObject", remoteObj); System.out.println("RMI Server started."); }}
-
编写RMI客户端:
import java.rmi.Naming;
public class RMIClient { public static void main(String[] args) throws Exception { RemoteInterface remoteObj = (RemoteInterface) Naming.lookup("rmi://localhost/RemoteObject"); String result = remoteObj.sayHello(); System.out.println("Response from server: " + result); } }
运行程序:

openjdk 11 rmic测试正常
openjdk 1.8.0¶
测试方法与上述一致,openjdk 1.8.0 rmic测试正常

rmiregistry¶
rmiregistry 是 Java RMI(Remote Method Invocation)的一个重要组件,它是一个简单的远程对象注册表,用于在 Java RMI 系统中维护远程对象的引用。rmiregistry 充当了客户端和服务器之间的中介,客户端可以从注册表中查找和获取远程对象的引用,从而进行远程方法调用。
openjdk 11¶
-
编写远程接口:
import java.rmi.Remote; import java.rmi.RemoteException;
public interface MyRemoteInterface extends Remote { public String sayHello() throws RemoteException; // 其他方法... }
实现远程接口:
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class MyRemoteImplementation extends UnicastRemoteObject implements MyRemoteInterface {
public MyRemoteImplementation() throws RemoteException {
// 构造函数
}
public String sayHello() throws RemoteException {
return "Hello from the remote server!";
}
// 其他方法的实现...
}
启动rmiregistry:
rmiregistry 1098
openjdk 11 rmiregistry运行正常

注册远程对象:
import java.rmi.Naming;
public class MyRMIServer {
public static void main(String[] args) {
try {
MyRemoteInterface remoteObj = new MyRemoteImplementation();
Naming.rebind("RemoteObject", remoteObj);
System.out.println("Remote object registered successfully.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
查询远程对象:
import java.rmi.Naming;
public class MyRMIClient {
public static void main(String[] args) {
try {
MyRemoteInterface remoteObj = (MyRemoteInterface) Naming.lookup("rmi://localhost/RemoteObject");
String result = remoteObj.sayHello();
System.out.println("Response from server: " + result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行RMI服务器和客户端:

openjdk 1.8.0¶
openjdk 1.8.0 rmiregistry运行正常

unpack200¶
npack200 是 JDK 自带的一个工具,用于解压缩 Java 类文件的归档文件(JAR 文件),并将其转换为 Java 虚拟机(JVM)所能理解的格式。它是 Java 虚拟机中的一个重要组件,用于在运行时动态地加载和解析 Java 类文件。
pack200 --no-gzip myapp.pack Counter.jar
unpack200 -r myapp.pack Counter.jar
openjdk 11¶
openjdk 11 unpack200验证正常。

openjdk 1.8.0¶
openjdk 1.8.0 unpack200验证正常。