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

2018年8月29日 发表评论 阅读评论

一、解包java9 modules文件

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

java modules

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

[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文件:

jimage extract modules 

二、java常见打包格式

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

JAR file format
JMOD file format
JIMAGE file format

1、jar格式

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

$ 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命令实现,如下:

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

3、JIMAGE格式

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

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

示例如下:

$  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命令如下:

jimage <extract | info | list | verify>
   <options> jimage...

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

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




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

  1. chao
    2018年9月29日11:18 | #1

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

    • admin
      2018年9月29日19:39 | #2

      在博客里已经记录过了,仔细看

  1. 本文目前尚无任何 trackbacks 和 pingbacks.