我想更深入地了解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关于外部依赖关系存储的信息是什么?它是否存储了它们的确切版本,如果它们在运行时不匹配,它会抱怨吗?但为什么它甚至允许运行程序引用相同的依赖,但不同的版本?
答案 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