Skip to content

常用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的密钥库文件。

image.png

  • 使用Jarsigner签名JAR文件

一旦有了密钥库,就可以使用Jarsigner来签署您的JAR文件。以下是签署JAR文件的示例命令:

jarsigner -keystore mykeystore.jks -storepass keystorepassword -keypass keypassword test.jar myalias

密码已打马赛克。

image.png

  • 验证签名

可以使用Jarsigner验证已签名的JAR文件,以确保它的完整性和来源。以下是验证签名的示例命令:

jarsigner -verify -keystore mykeystore.jks -storepass hz19981004 test.jar

输入错误的密码,验证失败。输入正确的密码,验证成功。

image.png

openjdk1.8.0

测试方法与上述一致,验证通过

image.png

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

image.png

openjdk 1.8.0

image.png

javap

openjdk1.8/11均可正常运行

openjdk 11

image.png

openjdk 1.8.0

image.png

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正常运行

image.png

openjdk 1.8.0中无jdeprscan工具

image.png

jfr

JFR(Java Flight Recorder)是 Java 虚拟机(JVM)中的一个事件记录器,用于实时监控和收集 JVM 运行时的各种事件和数据,可以用于诊断和分析 Java 应用程序的性能问题、内存问题以及其他运行时行为。

java -XX:+FlightRecorder -XX:StartFlightRecording=disk=true,dumponexit=true,filename=myrecording.jfr binarytrees 18

openjdk11正常运行

image.png

openjdk 1.8.0中无jfr工具

image.png

jimage

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

openjdk11 jimage测试正常

image.png

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

image.png

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

image.png

jmap

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

jmap测试正常

openjdk 11

image.png

openjdk 1.8.0

image.png

jps

jps验证正常

openjdk 11

image.png

openjdk 1.8.0

image.png

jshell

openjdk11 jshell验证正常

image.png

java9 引入jshell, openjdk1.8.0无jshell工具

jstat

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

openjdk 11

jstat -gc 1258 10 10

openjdk 11 jstat验证正常。

image.png

openjdk 1.8.0

openjdk 1.8.0 jstat验证正常。

image.png

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验证正常。

image.png

openjdk 1.8.0

openjdk 1.8.0 keytool验证正常。

image.png

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:

image.png

  • 启动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); } }

运行程序:

image.png

openjdk 11 rmic测试正常

openjdk 1.8.0

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

image.png

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运行正常

image.png

注册远程对象:

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服务器和客户端:

image.png

openjdk 1.8.0

openjdk 1.8.0 rmiregistry运行正常

image.png

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验证正常。

image.png

openjdk 1.8.0

openjdk 1.8.0 unpack200验证正常。