Fen*_*rir 8 java eclipse import jar class
我有一个java项目,它使用两个具有相同类(com.sun.mail.imap.IMAPFolder
)的导入jar .有没有办法明确说明在导入类时使用哪个jar?使用:
import com.sun.mail.imap.IMAPFolder;
Run Code Online (Sandbox Code Playgroud)
似乎按照构建路径顺序使用类,但由于某种原因导致这似乎不是这种情况
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.NoSuchMethodError: com.sun.mail.imap.IMAPFolder.idle()V
at com.woodbury.GCM.HelperGmailMonitor.doEmail(HelperGmailMonitor.java:104)
at com.woodbury.GCM.Launch.listen(Launch.java:16)
at com.woodbury.GCM.Launch.main(Launch.java:10)
... 5 more
Run Code Online (Sandbox Code Playgroud)
在运行时.我正在eclipse中构建项目.
Dev*_*Dev 17
加载类时,第一个与相关可见的完全限定名称匹配的实现ClassLoader
是返回的内容.具有相同完全限定名称的任何其他实现都被有效地隐藏ClassLoader
.
这在标准Java SE应用程序中意味着在类路径上列出的具有所需类的第一个代码库(即jar)提供它,并且隐藏了同一个完全限定类的所有其他代码库的实现.
假设A.jar包含已编译的类
package com.stackoverflow.example;
public class Hello {
public static String getGreeting(){
return "Hello, A!"
}
}
Run Code Online (Sandbox Code Playgroud)
假设B.jar包含已编译的类
package com.stackoverflow.example
public class Hello {
public static String getGreeting(){
return "Hello, B!"
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,上述两个类都具有相同的完全限定名称.
假设主要类是
import com.stackoverflow.example.Hello;
public class ExampleMain {
public static void main(String[] args){
System.out.println(Hello.getGreeting());
}
}
Run Code Online (Sandbox Code Playgroud)
如果我要调用我的程序
java -cp A.jar:B.jar ExampleMain
输出是: Hello, A!
如果我像这样反转类路径
java -cp B.jar:A.jar ExampleMain
输出是: Hello, B!
您无法在Java源代码中执行您的要求.Java不是为此而设计的.
这是一个糟糕的情况,只能使用自定义类加载器可靠地处理,每个加载器都提供您需要的其中一个罐子.既然你首先要问这个问题,这可能不是你应该去的方式,因为这会带来很多新的耗时问题.
我强烈建议您找出为什么在类路径中有两个不同版本的同一个jar并重新编写程序,因此您只需要一个版本.