eclipse中package/class/method完全相同的引用顺序问题.
现有三个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>