繁体   English   中英

Java软件包版本 - 正确使用它

[英]Java package versions - getting it right

我想更深入地了解Java如何处理不同版本的Classes / Packages /等,但找不到任何资源或者至少是google的最佳方式。 问题如下。

试想一下,我们有一些外部包com.external.package包含的定义SomeInterface

现在我编写一个实现SomeInterface的java类MyClass ,并使用com.external.package v1.0.0 接下来我打包一个包含MyClass的(瘦)jar。

现在我将这个jar插入另一个正在寻找SomeInterface实现的SomeInterface ,但在它的依赖项中,它使用的是com.external.package v2.0.0

是什么原因我得到Failed to find any class that implements SomeInterface是版本SomeInterface不要在程序和包含其扩展一个类的jar匹配吗?

基本上我想找到答案的问题是jars存储的关于外部依赖关系的信息? 它是否存储了它们的确切版本,如果它们在运行时不匹配,它会抱怨吗? 但为什么它甚至允许运行程序引用相同的依赖,但不同的版本?

我失败的原因是找不到任何实现SomeInterface的类,SomeInterface的版本在程序和包含扩展它的类的jar中不匹配?

这里没有发生“版本控制”。 简单地说,错误表明类路径中不存在这样的类。 例如,您没有在java命令中添加-cp来添加额外的JAR /类文件。

可能发生的其他原因是API在v1中将类标记为已弃用,然后决定将其从v2中删除。 在这种情况下,您最好尝试在打包自己的代码之前,针对正确的库版本编译和测试代码。 如果你制作了一个超级JAR,那么这些类应该被设置为阴影,你可能不会缺少类。

Maven项目确实具有传递,版本化依赖项的概念,但您没有对此做过任何说明

看到原始问题已经找到答案,似乎有点提及Java包和JAR可用于指定包版本信息,如以下文档中所述: https//docs.oracle.com/javase/8 /docs/technotes/guides/versioning/spec/versioning2.html#wp89936

此外,Oracle Java教程还讨论了它们以及有关将程序​​部署为JAR文件的更多概念,如下所述: https//docs.oracle.com/javase/tutorial/deployment/jar/index.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM