清单spec / impl vs pom的版本

时间:2014-01-11 07:14:23

标签: maven manifest release

那么,

  

存在包版本号以识别差异   规范和实现之间,即错误。

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

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

问题:

  • 当impl不同时,可以发布两次Maven spec版本吗?
  • 为什么不支持Maven中的可选规范版本?
  • 这是否意味着我应该在Maven中使用Spec-versions来保持最新技术水平?

2 个答案:

答案 0 :(得分:3)

  1.   

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

    是的,这是可能的,因为spec和impl-version值是由用户定义的。

  2.   

    为什么不支持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}
    
  3.   

    这是否意味着我应该在Maven中使用Spec版本来保持最新技术水平?

    在我看来,很少使用JDK版本,常见的模式是对maven工件使用适当的版本。

  4. 参考文献:

答案 1 :(得分:3)

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

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

  1. 将您的模块拆分为两个模块,例如my-module-api和my-module-impl
  2. 在impl模块中定义一个或多个属性,指向正确的spec坐标(版本,以及可能的groupId和artifactId)
  3. 将您的清单文件过滤或配置存档以创建条目
  4. (可选)创建一个结合api和实现的阴影工件(但这有点否定了拆分模块的优点)
  5. 请看以下示例(为了简洁起见,我已经省略了一些最佳实践,例如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
    

    后果:

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

    回到你的问题:

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

    使用此模型,您可以为同一规范实现不同的实现,只要它们本身具有不同的坐标(通常是不同的版本)。

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

    Maven使用单个坐标pre工件,spec版本通过使用依赖项实现。在正常的工作流程中,您要么对规范版本感兴趣,要么对实现版本感兴趣,但两者同时很少。如有必要,您可以使用dependencyManagement和enforcer规则确保实现符合规范

    • 这是否意味着我应该在Maven中使用Spec-versions来保持最新技术水平?

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

    还有一件事......

    在这个模型中,没有办法从实现中读取规范版本(没有查看Manifest)。

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