现在的位置: 首页 > 综合 > 正文

eclipse中package/class/method完全相同的引用顺序问题.

2013年12月17日 ⁄ 综合 ⁄ 共 2252字 ⁄ 字号 评论关闭

现有三个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>

抱歉!评论已关闭.