代码之家  ›  专栏  ›  技术社区  ›  Grumblesaurus

编译依赖于外部Jar的模块

  •  4
  • Grumblesaurus  · 技术社区  · 6 年前

    simple example using Project Jigsaw 在Java11.0.1中,在Ubuntu18.04上使用OracleJDK11构建。

    在这个例子之后,我创建了一个简单的项目,它编译成一个模块,将模块打包成一个jar,然后使用 jlink

    .:
    build.sh  src
    
    ./src:
    com  module-info.java
    
    ./src/com:
    greetings
    
    ./src/com/greetings:
    Main.java
    

    src/com/greetings/Main.java

    package com.greetings;
    
    public class Main {
       public static void main(String[] args) {
          System.out.println("Greetings!");
       }
    }
    

    src/module-info.java文件

    module com.greetings { }
    

    生成.sh

    #/bin/bash
    
    #clean up from last build
    rm -rf greetingsapp mlib mods
    
    #compile
    javac -d mods/com.greetings src/module-info.java src/com/greetings/Main.java
    
    #Make module jar
    mkdir mlib
    jar --create --file=mlib/com.greetings.jar --main-class=com.greetings.Main -C mods/com.greetings .
    
    #build distribution
    jlink --module-path /usr/lib/jvm/java-11-oracle/jmods/:mlib --add-modules com.greetings --output greetingsapp --strip-debug --no-header-files --no-man-pages --launcher greetings=com.greetings
    
    #run
    greetingsapp/bin/greetings
    

    所有这些都有效。现在问题来了:

    接下来我要做的是使用一个外部库,所以我在Main.java中添加了几行代码:

    Main.java-已更新

    package com.greetings;
    
    import org.apache.commons.cli.CommandLine; //new line
    
    public class Main {
    
       CommandLine line; //new line
    
       public static void main(String[] args) {
          System.out.println("Greetings!");
       }
    }
    

    然后我把 commons-cli-1.4.jar 在一个名为 lib

    创建了此文件结构:

    .:
    build.sh  lib  src
    
    ./lib:
    commons-cli-1.4.jar
    
    ./src:
    com  module-info.java
    
    ./src/com:
    greetings
    
    ./src/com/greetings:
    Main.java
    

    我修改了编译行,将commons jar包含在类路径中:

    javac -cp lib/commons-cli-1.4.jar:. \
    -d mods/com.greetings \
    src/module-info.java src/com/greetings/Main.java
    

    src/com/greetings/Main.java:10: error: package org.apache.commons.cli is not visible
    import org.apache.commons.cli.CommandLine;
                         ^
       (package org.apache.commons.cli is declared in the unnamed module, but module org.apache.commons.cli does not read it)
    1 error
    

    如何修改我的项目,以便根据commons-cli-1.4.jar进行编译 ?


    Edit,在用户nullpointer的建议下,我尝试将-cp标志更改为-p标志,因此将外部jar添加到模块路径中。不幸的是,这也行不通。下面是我尝试过的各种javac命令,它们也不起作用:

    javac -p lib -d mods/com.greetings \
    src/module-info.java src/com/greetings/Main.java
    
    javac --module-path=lib -d mods/com.greetings \
    src/module-info.java src/com/greetings/Main.java
    
    javac -p lib/commons-cli-1.4.jar -d mods/com.greetings \
    src/module-info.java src/com/greetings/Main.java
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Naman    6 年前

    unnamed module. .

    . ...

    ...

    此限制是有意的,因为允许命名模块依赖于类路径的任意内容将导致 无法进行可靠配置。

    相反,试着把同样的罐子放在桌子上 模块路径 从这里可以推断出 automatic module


    您还需要确保相应地更新模块的模块声明,以定义对新添加的模块的依赖,从而访问其导出的包。

    module com.greetings { 
        requires commons.cli;
    }
    

    生成.sh 但是 连接步骤 , because of the presence of an automatic module .

    推荐文章