Java包版本 - 正确使用

时间:2017-09-08 07:03:08

标签: java versioning

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

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

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

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

我得Failed to find any class that implements SomeInterface SomeInterface版本的curl -X PUT \ https://anypoint.mulesoft.com/cloudhub/api/v2/applications/highfiles \ -H 'authorization: Bearer XXX' \ -H 'cache-control: no-cache' \ -H 'content-length: 0' \ -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \ -H 'host: anypoint.mulesoft.com' \ -H 'postman-token: XXX' \ -H 'x-anypnt-env-id: XXX' \ -H 'x-anypnt-org-id: XXX' \ -F 'appInfoJson={ "muleVersion": { "version": "3.8.5" }, "properties":{"env":"dev"} }' 版本在程序和包含扩展它的类的jar中不匹配的原因是什么?

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

2 个答案:

答案 0 :(得分:2)

  

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

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

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

Maven项目确实有传递的,版本化的依赖项的概念,但是你没有说过任何关于它的内容

答案 1 :(得分:1)

看到原始问题已经找到答案,似乎有点提及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