java module解压及java常见打包格式

一、解包java9 modules文件

目前公司新上的一个项目的agent是用java写的,在做立项评审时需要检查其安全性。在拿到安装包后,检查执行命令和入口文件,发现一个modules,如下图所示:



<img src="https://www.361way.com/wp-content/uploads/2018/08/java-modules.png" width="499" height="302" title="java modules" alt="java modules" />



因为之前所知的java打包方式有jar、jmod两种格式。其直接可以通过查看后缀名了解其类型,而且常见的jar也是直接可以通过winrar打开看到内部的class文件构成的。因为发现里面有libzip.so文件,尝试通过zip和rar解压,发现不成功。在查看agent安装里自提取的java版本发现其是java10,查看其中的模块名如下:



<br />
[root@localhost bin]# ./java -version
java version "10.0.2" 2018-07-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.2+13)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.2+13, mixed mode)
[root@localhost bin]# ./java --list-modules
java.base@10.0.2
java.logging@10.0.2
mymodule@1.0
虽然有了一些基本信息,但还是不得要领,找不到入口文件是如何打开的。实在想不出办法后,找java大牛朋友帮忙,在简单向其咨询后,其告知在java9以后的版本里,可以通过如下命令进行解包modules文件:



<br />
jimage extract modules 

二、java常见打包格式

java的打包格式有如下三种:



<br />
JAR file format
JMOD file format
JIMAGE file format

1、jar格式

这种格式是最常见的格式,该格式是基于zip压缩,并改后缀为.jar格式,可以使用jar命令进行打包,如下:



<br />
$ jar [OPTION...] [ [--release VERSION][-C dir] files] ...
$ jar --create --verbose --file mydir/org.mymodule1
-C org.mypackage1.jdk7/classes .
--release 8 -C  org.mypackage1.jdk8/classes .
--release 9 -C  org.mypackage1.jdk9/classes .

2、jmod格式

jmod格式也是基于zip压缩,其可以包含jar格式不能包含的类型文件,但其和jar格式的区别是,其不能被执行。英文原话是:This means this files contained in JMOD can be used only at compile-time or link-time, but not at runtime. ,其创建和解压都是可以通过jmod命令实现,如下:



<br />
$ jmod (create|extract|list|describe|hash)  
$ jmod create --class-path services/org.app.services.jar  jmods/org.app.services.jmod

3、JIMAGE格式

该格式是在java9以后的版本中增加的格式,其是优化了jvm runtime的一种格式。其打包使用jlink命令,解包使用jimage 命令。jlink语法如下:



<br />
jlink  --module-path 
   --add-modules [,...]
示例如下:



<br />
$  jlink --module-path jmods;/home/java9_projects/dbapp/jmods
--add-modules org.dbapp.model,org.dbapp.services,org.dbapp.view
--launcher runapp=org.dbapp.view/Main
--output dbapp
jimage命令如下:



<br />
jimage 
    jimage...
<br />



Java9新特性也可以参看下csdn上的一篇文章<a href="https://blog.csdn.net/54powerman/article/details/78091989" target="_blank" rel="noopener">《Java9新特性——module模块系统》</a>



关于java下各种格式打包的详细介绍可以参看<a href="https://www.developer.com/java/data/how-modules-are-packaged-in-java-9.html#" target="_blank" rel="noopener">《How Modules Are Packaged in Java 9》</a>

java module解压及java常见打包格式》有2条评论

  1. 大佬,请教下怎么把解包后的module再次打包成module?我想做jre精简,只需要使用到module里的java.base,我使用jlink不能把java.base重新打包成module啊,求指教

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注