开发者社区> 问答> 正文

MVN和Javac之间的类加载不一致

考虑下面的伪代码

项目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

展开
收起
垚tutu 2019-12-04 17:02:26 630 0
0 条回答
写回答
取消 提交回答
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载