- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
嗯,
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
假设供应商提供了规范和实现版本。
问题:
最佳答案
Maven 和 Java-Spec/Impl 版本是略有不同的概念。可以使它们相互协作,但是,这需要一些努力。
Maven 的多模块方法鼓励将模块拆分为 api(或规范)和实现模块。因此,要使用 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使用单坐标前置 Artifact ,spec版本使用依赖实现。在正常的工作流程中,您要么对规范版本感兴趣,要么对实现版本感兴趣,但很少同时对两者感兴趣。如有必要,您可以使用 dependencyManagement 和 enforcer 规则确保实现与规范相匹配
不,我认为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/
我想实现一个转换特性,涵盖支持现有转换的所有类型。我认为这可以通过以下方式完成: impl Into for T where T: Into, { fn into(self) -> B {
看来我不能在 Rust 中调用相同结构的方法,或者我不明白: struct St1 { aa: String } impl St1 { pub fn method1() -> String {
我正在使用 pimpl idiom在我的代码中有很多,主要是为了减少编译时间。 我遇到了调用 C 库的情况。我有一个 C++ 包装器类,它有它的接口(interface),血淋淋的细节都在 impl
我有以下代码: use std::ops::Div; use std::ops::Mul; #[derive(Debug)] struct Foo { bar: T, } impl Foo w
从 Rust 1.34 开始,我们可以通过实现 TryFrom 来编写类型之间的易错转换。特征: struct Foo(i32); struct Bar; impl TryFrom for Foo {
我开始了一个非常小的程序来玩 Rust 中的解析器组合器,很快就遇到了一个我觉得很奇怪的错误: trait Parser { fn parse(&self, input: &'a [u8])
这个问题在这里已经有了答案: NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton() (4 个答案) 关闭 5 年前。
在扩展其他 crate 中定义的 trait 时,似乎有两种方法可以默认实现新的 trait。 特征的原始定义是 pub trait Trait1 { fn f1(&self); } 为了扩展
我通过扩展 AbstractEntryProcessor 创建了用于更新 map 条目的自定义条目处理器。当我的应用程序在两个实例上的集群中运行并且执行入口处理器时,我收到以下异常: com.haze
我的本地环境:OSX 10.9.2,java1.6 我使用 java api 连接 hbase 和 maven 来管理我的项目,我将 Hbase-0.94.17 和 Hadoop-core-1.0
包装一些生成的类,我使用 classImpl 绑定(bind),但生成的类中的集合返回生成的类型而不是 classImpl 中的类型,我当然想要一个 classImpl 列表...... 我的 xsd
我正在编写一个守护程序来获取某些游戏的服务器统计信息。 在编译中我收到一条消息: cannot access org.apache.commons.pool2.impl.GenericObjectPo
我最近将旧应用程序的后台服务迁移到 WorkManager .在最近的设备上(低至 sdk 22 包括 )它看起来不错,运行重复的工作单元并按预期在设备重新启动时安排它们。 问题是当我测试旧版本时(旧
这个问题在这里已经有了答案: Xerces error: org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl (2 个答案) 关闭 5 年前。 我正在使用
如果我有一个需要Default实现的结构,如果所有字段的类型都有Default实现的themsevles,那么我可以使用derive 宏,否则我需要手动实现 Default。但是,在某些情况下,我有一
我看到 Rust 代码库中经常出现以下模式,但我找不到解释为什么要使用它。 将 impl ... for 用于什么目的? build ? 伪代码: impl Handler { pub fn
我用 Angular js 编写了一些小代码。它有效,但我收到一些错误“无法读取未定义的属性'impl'”。有人知道那是什么吗? 这是我的 html:
我正在尝试创建一个通用实现,用于根据不同的字段类型生成 From/Into。 Link to Playground 我发现了以下问题: error[E0425]: cannot find value
在下面传递一个trait作为参数的例子中,在函数签名中发送impl需要什么? 我知道 traits 是更通用的类型而不是具体类型,但是由于 Rust 编译器不允许跨结构和 traits 共享名称,为什
我有一个带有两个通用 typenum 参数的实现。当参数相同时,impl 的函数应该返回不同的类型。 (不同类型是一种更紧凑的表示,只有当类型参数相同时才能实现。)是否可以使用基于类型相等性的不同实现
我是一名优秀的程序员,十分优秀!