12

我认为 JPMS 不支持模块版本。但是,当我这样做时,java --list-modules我有以下输出:

java.activation@9
java.base@9
java.compiler@9
java.corba@9
java.datatransfer@9
java.desktop@9
java.instrument@9 
....

所以,我无法理解这@9是什么。是这个版本还是什么?如果 JPMS 支持模块版本,我可以在模块 A 的 module-info 中设置模块 A 需要特定版本的模块 B 吗?

4

3 回答 3

9

我不明白这个@9 是什么。是这个版本还是什么?

是的,它是模块的版本。

如果 JPMS 支持模块版本,我可以在模块 A 的 module-info 中设置模块 A 需要特定版本的模块 B 吗?

不,您不能在另一个模块的声明中引用模块的特定版本。我相信这在模块系统状态#模块声明中总是明确提到

模块的声明不包括版本字符串,也不限制它所依赖的模块的版本字符串。这是故意的,因为解决版本选择问题不是模块系统的目标,最好留给构建工具和容器应用程序。

于 2018-01-08T13:49:50.100 回答
7

为了更清楚地了解现有@9信息:

JVMS 9module_version_indexModule_attribute结构中包含一个字段,即类文件格式支持存储模块的版本字符串,甚至requires_version_index已经定义了一个,但我不知道任何与评估此版本有关的规范,使这些数据纯粹是信息性的在此刻。

有关模块版本的当前状态(从 Java 9 GA 开始)的更多信息可以在问题摘要中找到。版本的格式在ModuleDescriptor.Version API 中定义。

于 2018-01-09T11:43:41.523 回答
1

Java 模块系统无意解决版本选择或验证问题。

但是,它确实支持将版本信息添加到可通过 Module API 获得的模块 jar。

类似地,另一个模块上的“requires”子句将包含它编译时所针对的依赖项的版本。一个先决条件是其他模块需要包含版本号。

通过 API 提供这两个版本使得其他框架可以验证由不同模块组成的应用程序是否具有兼容的版本(例如,基于语义版本控制)。

在 Maven 构建中,java 'jar' 工具的以下用法允许将 project.version 添加到模块化 jar 中:

<plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.6.0</version>
            <executions>
                <execution>
                    <id>add-version-to-jar</id>
                    <phase>package</phase>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                    <configuration>
                        <executable>jar</executable>
                        <workingDirectory>${project.build.directory}</workingDirectory>
                        <arguments>
                            <argument>--update</argument>
                            <argument>--verbose</argument>
                            <argument>--module-version</argument>
                            <argument>${project.version}</argument>
                            <argument>--file</argument>
                            <argument>${project.build.finalName}.jar</argument>
                            <argument>-C</argument>
                            <argument>${project.build.outputDirectory}</argument>
                            <argument>.</argument>
                        </arguments>
                    </configuration>
                </execution>
            </executions>
</plugin>

可以在以下位置找到更详细的描述和代码

于 2018-02-25T15:22:16.597 回答