Can I require Java 9 module via MANIFEST.MF?

前端 未结 3 1638
我寻月下人不归
我寻月下人不归 2021-01-02 02:04

My Java library should be compatible with Java 8 and Java 9. For running with Java 9 we need some of the Java 9 modules.

I know that I can add it via command line wi

3条回答
  •  傲寒
    傲寒 (楼主)
    2021-01-02 02:24

    Modules express dependencies in their module declaration, so you have to create a module-info.java, define your module's name, dependencies (in your case with requires java.activation and requires java.xml.bind) and exports (more on that later).

    The module declaration must be compiled by a Java 9 compiler to create a module descriptor module-info.class that belongs into the JAR's root folder.

    Java 8 and 9

    Java versions prior to 9 will ignore the module-info.class, which means if you compile the rest of your code for Java 8 (either by using javac 8 or by using the new --release flag on javac 9), your library still functions on that version.

    Will it solve your problem?

    Even Java 9 will only process your JAR as a module if it ends up on the module path. Only then will it see the requires clauses and include the Java EE modules you are using in the module graph. This means client using your library on Java 9's class path will still have to manually add the two modules via command line.

    Full modularization

    If your module is used on the module path, the accessibility rules make sure that:

    1. your clients can only use public types in packages you exported (at compile and at run time)
    2. your code only sees modules you depend on

    This means:

    1. you must include exports in your module declaration
    2. you must declare all dependencies, not just on the two JDK modules

    Particularly the second point can be tough if you depend on projects that are not yet modularized but that's another question.

提交回复
热议问题