创建专用于特定模块化应用的自定义运行时映

时间:2017-09-20 20:33:02

标签: java java-9 jlink java-module jdeps

假设我正在开发一个模块化应用程序,它由2个模块组成:com.spacey.explorer依赖于com.spacey.rocket模块。我在一些bin目录中有他们的模块化JAR文件。

我想准备轻量级JRE来运行它。显然,我使用 jlink 工具:

$ jlink --module-path /opt/jdk-9/jmods:../bin --add-modules com.spacey.explorer --output ~/custom-jre3

现在,当我在JRE中列出模块时,我得到以下内容:

$ java --list-modules 
com.spacey.explorer
com.spacey.rocket
java.base@9

也就是说,我的应用程序模块捆绑到JRE中。但是,如果我想构建一个只有JDK源模块的JRE,它足以运行我的应用程序保持我的应用程序模块分离,我必须知道我的JDK是什么依赖关系(在这个例子中只是java.base)并明确指定它们:

$ jlink --module-path /opt/jdk-9/jmods --add-modules java.base --output ~/custom-jre3

有没有办法让 jlink 为我这样做?或者任何可以为我找出那些JDK起源的依赖项的工具?

2 个答案:

答案 0 :(得分:8)

您可以使用jdeps工具。可能有用的选项是:

jdeps --list-deps <path>
  

列出JDK内部API的依赖性和使用。

其中<path>可以是.class文件,目录,JAR文件的路径名。

注意:使用jdeps -help列出所有选项及其语法。你可以使用

例如,我尝试了一下我的机器.m2文件夹中的jar文件,该文件夹将被视为未命名的模块,如:

jdeps --list-deps /.m2/repository/org/apache/commons/commons-lang3/3.6/commons-lang3-3.6.jar

<强> 输出:

java.base
java.desktop
unnamed module: /.m2/repository/org/apache/commons/commons-lang3/3.6/commons-lang3-3.6.jar

您也可以使用

jdeps --jdk-internals --class-path <path> <path>
  

查找JDK内部API的类级依赖性。默认情况下,它会分析--class-path和输入文件上的所有类,除非指定了-include选项。

2012年11月1日更新

jlink更改使用jlink --module-path jmods --add-modules $(jdeps --print-module-deps myapp.jar) --output image 作为:

<!DOCTYPE html>
<html>
<head>
    <title>Ryan Cole Home</title>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link rel="stylesheet" href="assets/css/main.css" />
    <link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
</head>
<body>

    <!-- Page Wrapper -->
        <div id="page-wrapper">

    <!-- Header -->
                <header id="header">
                    <h1><a href="index.html"><border>Ryan Cole Home</border>
</a></h1>
                    <nav>
                        <a href="about.html">About Me</a>
                        <a href="portfolio.html">Portfolio</a>
                        <a href="contact.html">Contact Me</a>
                    </nav>
                </header>

    <!-- Welcome To The Homepage -->
                <footer>
                <p>Welcome To The Homepage</p>
        </footer>
</body>
</html>
    <!-- Scripts -->
        <script src="assets/js/skel.min.js"></script>
        <script src="assets/js/jquery.min.js"></script>
        <script src="assets/js/jquery.scrollex.min.js"></script>
        <script src="assets/js/util.js"></script>
        <!--[if lte IE 8]><script src="assets/js/ie/respond.min.js">
</script><![endif]-->
        <script src="assets/js/main.js"></script>
</div>
</body>
</html>

答案 1 :(得分:6)

要使用jlink创建运行时映像,您需要使用--add-modules指定根模块 - 从这些模块开始,jlink将构建模块图并在新映像中包含所有已解析的模块。您使用了--add-modules com.spacey.explorer,因此jlink包含 com.spacey.explorer 及其所有依赖项。

要改为仅包含 com.spacey.explorer 所依赖的JDK模块,首先需要确定这些模块,例如with jdeps(另请参阅nullpointer's answer)。了解这些模块后,您可以使用--add-modules将它们定义为根模块。

在你的例子中:

$ jlink 
    --module-path /opt/jdk-9/jmods
    --add-modules java.base
    --output ~/custom-jre-for-explorer

如果模块不仅仅是 java.base ,比如说 java.sql ,那么命令看起来如下:

$ jlink 
    --module-path /opt/jdk-9/jmods
    --add-modules java.base,java.sql
    --output ~/custom-jre-for-explorer