一、解包java9 modules文件

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

java modules
java modules

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

1[root@localhost bin]# ./java -version
2java version "10.0.2" 2018-07-17
3Java(TM) SE Runtime Environment 18.3 (build 10.0.2+13)
4Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.2+13, mixed mode)
5[root@localhost bin]# ./java --list-modules
6java.base@10.0.2
7java.logging@10.0.2
8mymodule@1.0

虽然有了一些基本信息,但还是不得要领,找不到入口文件是如何打开的。实在想不出办法后,找java大牛朋友帮忙,在简单向其咨询后,其告知在java9以后的版本里,可以通过如下命令进行解包modules文件:

1jimage extract modules 

二、java常见打包格式

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

  1. JAR file format
  2. JMOD file format
  3. JIMAGE file format

1、jar格式

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

1$ jar [OPTION...] [ [--release VERSION][-C dir] files] ...
2$ jar --create --verbose --file mydir/org.mymodule1
3-C org.mypackage1.jdk7/classes .
4--release 8 -C  org.mypackage1.jdk8/classes .
5--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命令实现,如下:

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

3、JIMAGE格式

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

1jlink <options> --module-path <modulepath>
2   --add-modules <module>[,<module>...]</module></module></modulepath></options>

示例如下:

1$  jlink --module-path jmods;/home/java9_projects/dbapp/jmods
2--add-modules org.dbapp.model,org.dbapp.services,org.dbapp.view
3--launcher runapp=org.dbapp.view/Main
4--output dbapp

jimage命令如下:

1jimage <extract info="" list="" verify="">
2   <options> jimage...</options></extract>

Java9新特性也可以参看下csdn上的一篇文章《Java9新特性——module模块系统》

关于java下各种格式打包的详细介绍可以参看《How Modules Are Packaged in Java 9》