现有三个Eclipse的java项目如下, 其中Test3引用了Test1和Test2同时作为项目依赖.
其中, Test1中的A.java代码如下:
package com.cirotech.test; public class A { public void f() { System.out.println("From Test1.A"); } }
Test2中的A.java代码如下:
package com.cirotech.test; public class A { public void f() { System.out.println("From Test2.A"); } }
Test3中B.java代码如下:
import com.cirotech.test.A; public class B { /** * @param args */ public static void main(String[] args) { A a = new A(); a.f(); } }
运行B.java, 结果如下:
From Test1.A
很奇怪啊, 估计是Eclipse引用顺序为题, 于是打开%Workspece%\Test3\.classpath, 发现顺序如下:
<?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> <classpathentry combineaccessrules="false" kind="src" path="/Test1"/> <classpathentry combineaccessrules="false" kind="src" path="/Test2"/> <classpathentry kind="output" path="bin"/> </classpath>
手工颠倒顺序为:
<?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> <classpathentry combineaccessrules="false" kind="src" path="/Test2"/> <classpathentry combineaccessrules="false" kind="src" path="/Test1"/> <classpathentry kind="output" path="bin"/> </classpath>
再次运行B.java, 果然结果变了:
From Test2.A
哈哈, 看来classpath的加载顺序确实能影响结果. 不过, 编译器居然没有warn引用了2个package/class/method完全相同的java文件.
这点确实容易产生问题.
<?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> <classpathentry combineaccessrules="false" kind="src" path="/Test2"/> <classpathentry combineaccessrules="false" kind="src" path="/Test1"/> <classpathentry kind="output" path="bin"/> </classpath><?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> <classpathentry combineaccessrules="false" kind="src" path="/Test2"/> <classpathentry combineaccessrules="false" kind="src" path="/Test1"/> <classpathentry kind="output" path="bin"/> </classpath>