gpt4 book ai didi

java - Manifest spec/impl 与 pom 的版本

转载 作者:搜寻专家 更新时间:2023-11-01 02:09:30 24 4
gpt4 key购买 nike

嗯,

Package version numbers are present to identify differences between the specification and the implementation, i.e. bugs.

http://docs.oracle.com/javase/7/docs/technotes/guides/versioning/spec/versioning2.html

假设供应商提供了规范和实现版本。

问题:

  • 当 impl 不同时,Maven 规范版本可以发布两次吗?
  • 为什么 Maven 不支持可选的规范版本?
  • 这是否意味着我应该在 Maven 中使用规范版本来保持最先进?

最佳答案

Maven 和 Java-Spec/Impl 版本是略有不同的概念。可以使它们相互协作,但是,这需要一些努力。

Maven 的多模块方法鼓励将模块拆分为 api(或规范)和实现模块。因此,要使用 Java 版本,您必须:

  1. 将您的模块拆分为两个模块,例如my-module-api 和 my-module-impl
  2. 在您的 impl 模块中定义一个或多个属性,指向正确的规范坐标(版本,可能还有 groupId 和 artifactId)
  3. 过滤您的 list 文件或配置存档器以创建条目
  4. (可选)创建一个结合 api 和实现的阴影 Artifact (然而,这在某种程度上抵消了拆分模块的优势)

看下面的例子(为简洁起见,我省略了一些最佳实践,例如dependencyManagement:

规范模块:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.blackbuild.maven.demo.specimpl</groupId>
<artifactId>module-spec</artifactId>
<version>1.0</version>

<name>Module Demo Specification</name>

<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<!-- This is an API project, use only specification entries -->
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

规范 list :

Manifest-Version: 1.0
Built-By: xxx
Build-Jdk: 1.6.0_27
Specification-Title: Module Demo Specification
Created-By: Apache Maven 3.0.5
Specification-Version: 1.0
Archiver-Version: Plexus Archiver

执行模块

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.blackbuild.maven.demo.specimpl</groupId>
<artifactId>module-impl</artifactId>
<version>1.5-SNAPSHOT</version>

<name>Module Demo Implementation</name>

<properties>
<!-- Define specification coordinates -->
<spec-title>Module Demo Specification</spec-title>
<spec-vendor>Spec Provider</spec-vendor>
<spec-version>1.0</spec-version>
</properties>

<dependencies>
<dependency>
<groupId>com.blackbuild.maven.demo.specimpl</groupId>
<artifactId>module-spec</artifactId>
<version>${spec-version}</version>
</dependency>
</dependencies>

<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
<manifestEntries>
<Specification-Title>${spec-title}</Specification-Title>
<Specification-Version>${spec-version}</Specification-Version>
<Specification-Vendor>${spec-vendor}</Specification-Vendor>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

实现 list :

Manifest-Version: 1.0
Implementation-Title: Module Demo Implementation
Implementation-Version: 1.5-SNAPSHOT
Implementation-Vendor-Id: com.blackbuild.maven.demo.specimpl
Built-By: xxx
Build-Jdk: 1.6.0_27
Specification-Vendor: Spec Provider
Specification-Title: Module Demo Specification
Created-By: Apache Maven 3.0.5
Specification-Version: 1.0
Archiver-Version: Plexus Archiver

后果:

当然,您必须单独发布这两个模块。

回到你的问题:

  • 当 impl 不同时,Maven 规范版本可以发布两次吗?

使用这个模型,您可以对相同的规范有不同的实现,只要它们本身有不同的坐标(通常是不同的版本)。

  • 为什么 Maven 不支持可选的规范版本?

Maven使用单坐标前置 Artifact ,spec版本使用依赖实现。在正常的工作流程中,您要么对规范版本感兴趣,要么对实现版本感兴趣,但很少同时对两者感兴趣。如有必要,您可以使用 dependencyManagement 和 enforcer 规则确保实现与规范相匹配

  • 这是否意味着我应该在 Maven 中使用规范版本来保持最先进?

不,我认为Maven的api/impl模型使用更广泛。

还有一件事...

在此模型中,无法从实现中读取规范版本(不查看 list )。

您可以使用 {spec-version}_{impl-version} 版本控制方案来解决这个问题,对于上面的示例,impl-version 可能是 1.5_1.0.0-SNAPSHOT,但这会使版本号更难阅读.

关于java - Manifest spec/impl 与 pom 的版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21059706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com