那么,
存在包版本号以识别差异 规范和实现之间,即错误。
http://docs.oracle.com/javase/7/docs/technotes/guides/versioning/spec/versioning2.html
假设供应商提供了规范和版本。
问题:
答案 0 :(得分:3)
当impl不同时,可以发布两次Maven spec版本吗?
是的,这是可能的,因为spec和impl-version值是由用户定义的。
为什么不支持Maven中的可选规范版本?
Maven具有禁用规范和实现的选项,因此两者都是可选的
addDefaultSpecificationEntries
addDefaultImplementationEntries
了解Adding Implementation And Specification Details
从版本2.1开始,Maven Archiver默认情况下不再在清单中创建实现和规范详细信息。如果您想在清单中使用它们,则必须在配置中明确说明。
使用Manifest Entries可以覆盖默认值。
Specification-Title: ${project.name}
Specification-Version: ${project.version}
Specification-Vendor: ${project.organization.name}
Implementation-Title: ${project.name}
Implementation-Version: ${project.version}
Implementation-Vendor-Id: ${project.groupId}
Implementation-Vendor: ${project.organization.name}
这是否意味着我应该在Maven中使用Spec版本来保持最新技术水平?
在我看来,很少使用JDK版本,常见的模式是对maven工件使用适当的版本。
参考文献:
答案 1 :(得分:3)
Maven和Java-Spec / Impl版本的概念略有不同。它们可以互相合作,但需要付出一些努力。
Maven的多模块方法鼓励将模块拆分为api(或spec)和实现模块。因此,要使用java版本,您必须:
请看以下示例(为了简洁起见,我已经省略了一些最佳实践,例如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>
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>
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
当然,您必须单独发布这两个模块。
回到你的问题:
使用此模型,您可以为同一规范实现不同的实现,只要它们本身具有不同的坐标(通常是不同的版本)。
Maven使用单个坐标pre工件,spec版本通过使用依赖项实现。在正常的工作流程中,您要么对规范版本感兴趣,要么对实现版本感兴趣,但两者同时很少。如有必要,您可以使用dependencyManagement和enforcer规则确保实现符合规范
不,我认为Maven的api / impl模型使用得更广泛。
在这个模型中,没有办法从实现中读取规范版本(没有查看Manifest)。
您可以使用{spec-version} _ {impl-version}版本控制方案来解决此问题,对于上面的示例,impl-version可能是1.5_1.0.0-SNAPSHOT,但是这使得版本号更难以阅读