java中inform_java11教程--jlink工具

您可以使用该jlink工具将一组模块及其依赖项组装和优化为自定义运行时映像。

概要

jlink [options] --module-path modulepath --add-modules module [, module...]

options

命令行选项用空格分隔。请参阅jlink选项。

modulepath

jlink工具发现可观察模块的路径。这些模块可以是模块化JAR文件,JMOD文件或分解模块。

module

要添加到运行时映像的模块的名称。该jlink工具添加了这些模块及其传递依赖项。

描述

该jlink工具将一组模块及其传递依赖关系链接在一起,以创建自定义运行时映像。

注意: 开发人员负责更新其自定义运行时映像。

jlink选项

--add-modules mod[, mod...]

将命名模块添加mod到默认的根模块集合中。根模块的默认集合为空。

--bind-services

链接服务提供者模块及其依赖性。

-c={0|1|2} 或者- --compress={0|1|2}

启用资源压缩:

0:无压缩

1:常量字符串共享

2: 压缩

--disable-plugin pluginname

禁用指定的插件。有关受支持插件的列表,请参见jlink插件。

--endian {little|big}

指定生成的图像的字节顺序。默认值为系统体系结构的格式。

-h 或者-help

打印帮助消息。

--ignore-signing-information

当在运行时映像中链接签名的模块化JAR时,可以抑制致命错误。签名的模块化JAR的与签名相关的文件不会复制到运行时映像。

--launcher command=module 或者 --launcher command=module/main

指定模块的启动器命令名称或模块和主类的命令名称(模块和主类名称之间用斜杠(/)分隔)。

--limit-modules mod[, mod...]

将可观察模块的范围限制为已命名模块mod,以及主模块(如果有)以及该--add-modules选项中指定的任何其他模块的传递闭包中的可观察模块。

--list-plugins

列出可用的插件,您可以通过命令行选项访问这些插件。请参阅jlink插件。

-p 或者- --module-path modulepath

指定模块路径。

如果未指定此选项,则默认模块路径为$JAVA_HOME/jmods。该目录包含java.base模块以及其他标准和JDK模块。如果指定了此选项,但是无法从中解析java.base模块,那么该jlink命令将追加$JAVA_HOME/jmods到模块路径。

--no-header-files

排除头文件。

--no-man-pages

不包括手册页。

--output path

指定生成的运行时映像的位置。

--save-opts filename

将jlink选项保存在指定的文件中。

--suggest-providers [name, ...]

从模块路径中建议实现给定服务类型的提供程序。

--version

打印版本信息。

@filename

从指定文件中读取选项。

选项文件是一个文本文件,其中包含您通常会在命令提示符下输入的选项和值。选项可能显示在一行或几行上。您不能为路径名指定环境变量。您可以通过#在行首添加一个井号()来注释掉行。

以下是该jlink命令的选项文件的示例:

复制#Wed Dec 07 00:40:19 EST 2016

--module-path mlib

--add-modules com.greetings

--output greetingsapp

jlink插件

注意: 不支持本节中未列出的插件,它们可能会发生变化。

对于需要使用的插件选项pattern-list,该值是逗号分隔的元素列表,每个元素使用以下一种形式:

glob-pattern

glob:glob-pattern

regex:regex-pattern

@filename

filename 是包含要使用的模式的文件名,每行一个模式。

要获取所有可用插件的完整列表,请运行命令jlink --list-plugins。

表2-4 jlink插件列表

插件名称 选项 描述

compress

--compress={0|1|2}[:filter=pattern-list]

压缩输出图像中的所有资源。

0级:无压缩

级别1:常量字符串共享

2级:ZIP

pattern-list可以指定一个可选的过滤器以列出要包括的文件模式。

include-locales

--include-locales=langtag[,langtag]*

包括langtagBCP 47语言标记所在的语言环境列表。该选项支持RFC 4647中定义的语言环境匹配。使用此选项时,请确保添加模块jdk.localedata。

例:

--add-modules jdk.localedata --include-locales=en,ja,*-IN

order-resources

--order-resources=pattern-list

按优先顺序对指定路径进行排序。如果指定,则输入的每一行必须与要订购的路径完全匹配。 @filenamepattern-list

例:

--order-resources=/module-info.class,@classlist,/java.base/java/lang/

strip-debug

--strip-debug

从输出映像中剥离调试信息。

jlink示例

以下命令在目录中创建运行时映像greetingsapp。此命令链接模块com.greetings,其模块定义包含在目录中mlib。

复制jlink --module-path mlib --add-modules com.greetings --output greetingsapp

以下命令列出了运行时映像中的模块greetingsapp:

greetingsapp/bin/java --list-modules

com.greetings

java.base@11

java.logging@11

org.astro@1.0

以下命令在compressedrt去除调试符号的目录中创建运行时映像,使用压缩来减少空间,并包括法语语言环境信息:

jlink --add-modules jdk.localedata --strip-debug --compress=2 --include-locales=fr --output compressedrt

下面的示例运行时的图像的大小进行比较compressedrt用fr_rt,这是不可剥离的调试符号的,并且不使用压缩:

jlink --add-modules jdk.localedata --include-locales=fr --output fr_rt

du -sh ./compressedrt ./fr_rt

23M ./compressedrt

36M ./fr_rt

以下示例列出了实现java.security.Provider的提供程序:

jlink --suggest-providers java.security.Provider

Suggested providers:

java.naming provides java.security.Provider used by java.base

java.security.jgss provides java.security.Provider used by java.base

java.security.sasl provides java.security.Provider used by java.base

java.smartcardio provides java.security.Provider used by java.base

java.xml.crypto provides java.security.Provider used by java.base

jdk.crypto.cryptoki provides java.security.Provider used by java.base

jdk.crypto.ec provides java.security.Provider used by java.base

jdk.crypto.mscapi provides java.security.Provider used by java.base

jdk.security.jgss provides java.security.Provider used by java.base

以下示例创建一个名为的自定义运行时映像mybuild,该映像仅包含java.naming和jdk.crypto.cryptoki及其依赖项,而没有其他提供程序。请注意,这些依赖项必须存在于模块路径中:

复制jlink --add-modules java.naming,jdk.crypto.cryptoki --output mybuild

以下命令类似于创建名为的运行时映像的命令greetingsapp,不同之处在于它将通过服务绑定链接从根模块解析的模块。请参见Configuration.resolveAndBind方法。

复制jlink --module-path mlib --add-modules com.greetings --output greetingsapp --bind-services

以下命令列出了greetingsapp此命令创建的运行时映像中的模块:

greetingsapp/bin/java --list-modules

com.greetings

java.base@11

java.compiler@11

java.datatransfer@11

java.desktop@11

java.logging@11

java.management@11

java.management.rmi@11

java.naming@11

java.prefs@11

java.rmi@11

java.security.jgss@11

java.security.sasl@11

java.smartcardio@11

java.xml@11

java.xml.crypto@11

jdk.accessibility@11

jdk.charsets@11

jdk.compiler@11

jdk.crypto.cryptoki@11

jdk.crypto.ec@11

jdk.crypto.mscapi@11

jdk.internal.opt@11

jdk.jartool@11

jdk.javadoc@11

jdk.jdeps@11

jdk.jfr@11

jdk.jlink@11

jdk.localedata@11

jdk.management@11

jdk.management.jfr@11

jdk.naming.dns@11

jdk.naming.rmi@11

jdk.security.auth@11

jdk.security.jgss@11

jdk.zipfs@11

org.astro@1.0

转python写法:#!/bin/sh time_stamp=`date +%s` function CheckStop() { if [ $? -ne 0 ]; then echo "execute fail, error on line_no:"$1" exit!!!" exit fi } function GenEcdsaKey() { ec_param_file_path="/tmp/ec_param.pem."$time_stamp openssl ecparam -out $ec_param_file_path -name prime256v1 -genkey CheckStop $LINENO openssl genpkey -paramfile $ec_param_file_path -out $1 CheckStop $LINENO openssl pkey -in $1 -inform PEM -out $2 -outform PEM -pubout CheckStop $LINENO rm $ec_param_file_path echo "gen_ecdsa_key succ prikey_path:"$1" pubkey_path:"$2 } function GenEcdsaSign() { ec_sign_info_file="/tmp/ec_sign_info_file."$time_stamp ec_sign_info_sha256="/tmp/ec_sign_info_sha256."$time_stamp ec_binary_sign_file="/tmp/ec_binary_sign_file."$time_stamp echo -n "$1"_"$2" > $ec_sign_info_file openssl dgst -sha256 -binary -out $ec_sign_info_sha256 $ec_sign_info_file CheckStop $LINENO openssl pkeyutl -sign -in $ec_sign_info_sha256 -out $ec_binary_sign_file -inkey $3 -keyform PEM CheckStop $LINENO openssl base64 -e -in $ec_binary_sign_file -out $4 CheckStop $LINENO rm $ec_sign_info_file $ec_sign_info_sha256 $ec_binary_sign_file echo "gen_ecdsa_sign succ sign_file_path:"$4 } function VerifyEcdsaSign() { ec_sign_info_file="/tmp/ec_sign_info_file."$time_stamp ec_sign_info_sha256="/tmp/ec_sign_info_sha256."$time_stamp ec_binary_sign_file="/tmp/ec_binary_sign_file."$time_stamp echo -n "$1"_"$2" > $ec_sign_info_file openssl dgst -sha256 -binary -out $ec_sign_info_sha256 $ec_sign_info_file CheckStop $LINENO openssl base64 -d -in $4 -out $ec_binary_sign_file CheckStop $LINENO openssl pkeyutl -verify -in $ec_sign_info_sha256 -sigfile $ec_binary_sign_file -pubin -inkey $3 -keyform PEM rm $ec_sign_info_file $ec_sign_info_sha256 $ec_binary_sign_file } function Usage() { echo "Usage:" echo "mmiot_ecdsa_sign.sh gen_ecdsa_key <private_key_file_path> <public_key_file_path>" echo "mmiot_ecdsa_sign.sh gen_ecdsa_sign <product_id> <sn> <private_
05-31
以下是转换后的 Python 代码: ```python #!/usr/bin/env python import os import subprocess import base64 time_stamp = str(int(time.time())) def check_stop(line_no, ret): if ret != 0: print("execute fail, error on line_no: ", line_no, " exit!!!") exit() def gen_ecdsa_key(private_key_file_path, public_key_file_path): ec_param_file_path = "/tmp/ec_param.pem." + time_stamp ret = subprocess.call(["openssl", "ecparam", "-out", ec_param_file_path, "-name", "prime256v1", "-genkey"]) check_stop(sys._getframe().f_lineno, ret) ret = subprocess.call(["openssl", "genpkey", "-paramfile", ec_param_file_path, "-out", private_key_file_path]) check_stop(sys._getframe().f_lineno, ret) ret = subprocess.call(["openssl", "pkey", "-in", private_key_file_path, "-inform", "PEM", "-out", public_key_file_path, "-outform", "PEM", "-pubout"]) check_stop(sys._getframe().f_lineno, ret) os.remove(ec_param_file_path) print("gen_ecdsa_key succ prikey_path:", private_key_file_path, " pubkey_path:", public_key_file_path) def gen_ecdsa_sign(product_id, sn, private_key_file_path, sign_file_path): ec_sign_info_file = "/tmp/ec_sign_info_file." + time_stamp ec_sign_info_sha256 = "/tmp/ec_sign_info_sha256." + time_stamp ec_binary_sign_file = "/tmp/ec_binary_sign_file." + time_stamp with open(ec_sign_info_file, 'w') as f: f.write(product_id + "_" + sn) ret = subprocess.call(["openssl", "dgst", "-sha256", "-binary", "-out", ec_sign_info_sha256, ec_sign_info_file]) check_stop(sys._getframe().f_lineno, ret) ret = subprocess.call(["openssl", "pkeyutl", "-sign", "-in", ec_sign_info_sha256, "-out", ec_binary_sign_file, "-inkey", private_key_file_path, "-keyform", "PEM"]) check_stop(sys._getframe().f_lineno, ret) with open(ec_binary_sign_file, 'rb') as f: sign_binary = f.read() sign_base64 = base64.b64encode(sign_binary).decode() with open(sign_file_path, 'w') as f: f.write(sign_base64) os.remove(ec_sign_info_file) os.remove(ec_sign_info_sha256) os.remove(ec_binary_sign_file) print("gen_ecdsa_sign succ sign_file_path:", sign_file_path) def verify_ecdsa_sign(product_id, sn, public_key_file_path, sign_file_path): ec_sign_info_file = "/tmp/ec_sign_info_file." + time_stamp ec_sign_info_sha256 = "/tmp/ec_sign_info_sha256." + time_stamp ec_binary_sign_file = "/tmp/ec_binary_sign_file." + time_stamp with open(ec_sign_info_file, 'w') as f: f.write(product_id + "_" + sn) ret = subprocess.call(["openssl", "dgst", "-sha256", "-binary", "-out", ec_sign_info_sha256, ec_sign_info_file]) check_stop(sys._getframe().f_lineno, ret) with open(sign_file_path, 'r') as f: sign_base64 = f.read() sign_binary = base64.b64decode(sign_base64) with open(ec_binary_sign_file, 'wb') as f: f.write(sign_binary) ret = subprocess.call(["openssl", "pkeyutl", "-verify", "-in", ec_sign_info_sha256, "-sigfile", ec_binary_sign_file, "-pubin", "-inkey", public_key_file_path, "-keyform", "PEM"]) os.remove(ec_sign_info_file) os.remove(ec_sign_info_sha256) os.remove(ec_binary_sign_file) print("verify_ecdsa_sign result:", "succ" if ret == 0 else "fail") if len(sys.argv) < 2: print("Usage:") print("python mmiot_ecdsa_sign.py gen_ecdsa_key <private_key_file_path> <public_key_file_path>") print("python mmiot_ecdsa_sign.py gen_ecdsa_sign <product_id> <sn> <private_key_file_path> <sign_file_path>") print("python mmiot_ecdsa_sign.py verify_ecdsa_sign <product_id> <sn> <public_key_file_path> <sign_file_path>") exit() if sys.argv[1] == "gen_ecdsa_key": gen_ecdsa_key(sys.argv[2], sys.argv[3]) elif sys.argv[1] == "gen_ecdsa_sign": gen_ecdsa_sign(sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5]) elif sys.argv[1] == "verify_ecdsa_sign": verify_ecdsa_sign(sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5]) else: print("Usage:") print("python mmiot_ecdsa_sign.py gen_ecdsa_key <private_key_file_path> <public_key_file_path>") print("python mmiot_ecdsa_sign.py gen_ecdsa_sign <product_id> <sn> <private_key_file_path> <sign_file_path>") print("python mmiot_ecdsa_sign.py verify_ecdsa_sign <product_id> <sn> <public_key_file_path> <sign_file_path>") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值