考虑下面的伪代码
项目A
class A
public static void main(String[] args){
println("hello from version" + Version.number)
}
class Version {
public static final long number = 1;
}
项目B
class B
public static void main(String[] args){
println("hello from version" + Version.number)
}
class Version {
public static final long number = 2;
}
我总共造了四个罐子。
Jar A:使用javac,包含Class A +版本 Jar B:使用javac,包含Class B +版本 Jar C:使用mvn,包含A +版本 Jar D:使用mvn,包含B +版本 然后,我将Jars A和B添加到classpath并执行以下命令:
A.main()
B.main()
产生以下结果(两种情况下请注意相同的版本)
hello from version 1
hello from version 1
我对mvn编译的jar(C和D)做了同样的操作,结果如下
hello from version 1
hello from version 2
看起来不错。
我假设类加载器发生了一些奇怪的事情,似乎对于javac编译的项目,它正在加载Version类遇到的第一个实例,并为class A使用相同的实例B。对于mvn编译的项目,这不会发生。
我读过他们不使用Java,但实际上javax.tools.JavaCompiler-是什么原因造成的?值得一提的是,我已经检查了用于解析Version类的类加载器,在所有情况下,它都是URLClassLoader
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。