在Eclipse Galileo上,在执行Debug As/Web Application时得到以下ClassNotFoundException.但是在运行As/Web Application时工作得很好.
我收到消息"源附件不包含文件URLClassLoader.class的源.您可以通过单击下面的更改附加源来更改源附件:"
在项目窗口中,似乎URLClassLoader类来自Java.net包,它来自/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/classes.jar.
我在机器上发现了罐子,我还缺少什么?为什么它只是调试问题?
我的iMac 10.6.5机器上的JRE系统库是否可能已过时?或者以某种方式安装/卸载某些jar /包导致了这个问题?
这就是我所拥有的 - JRE系统库[JVM 1.6.0(MacOS X默认)] - 会更新它有助于解决问题吗?但如何更新?
请帮忙!
com.google.appengine.tools.development.DevAppServerMain at localhost:57873
Thread [main] (Suspended (exception ClassNotFoundException))
Launcher$ExtClassLoader(URLClassLoader).findClass(String) line: 207
Launcher$ExtClassLoader.findClass(String) line: 229
Launcher$ExtClassLoader(ClassLoader).loadClass(String, boolean) line: 307
Launcher$AppClassLoader(ClassLoader).loadClass(String, boolean) line: 296
Launcher$AppClassLoader.loadClass(String, boolean) line: 301
Launcher$AppClassLoader(ClassLoader).loadClass(String) line: 248
InstrumentationImpl.loadClassAndStartAgent(String, String, String) line: 280
InstrumentationImpl.loadClassAndCallPremain(String, String) line: 338
/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/bin/java (Nov 30, 2010 9:40:41 PM)
Run Code Online (Sandbox Code Playgroud) 我正在玩Java中的classLoaders并注意到一件奇怪的事情.如果classLoader从jar加载一个类,即使你没有引用你的classLoader,这个jar也会无限期地被锁定.
在下面的示例中,jar包含一个名为HelloWorld的类.我所做的是尝试通过classLoader加载jar中包含的类,该类动态地添加jar.如果设置skip为true和不调用Class.forName,则可以删除jar,但如果不跳过,即使取消引用classLoader(classLoader = null),也不能删除jar,直到JVM退出.
这是为什么?
PS:我使用的是java 6,代码非常冗长,用于测试目的
package loader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class TestClassLoader {
private URLClassLoader classLoader;
public TestClassLoader() throws MalformedURLException, IOException {
System.out.println("Copying jar");
if (copyJar()) {
System.out.println("Copying SUCCESS");
performFirstCheck();
} else {
System.out.println("Copying FAILED");
}
}
public static void main(String[] args) throws IOException {
System.out.println("Test started");
TestClassLoader testClassLoader = new TestClassLoader();
System.out.println("Bye!");
}
public void …Run Code Online (Sandbox Code Playgroud) 我正在使用扩展URLClassLoader的自定义类加载器.我将一些类加载到我的自定义类加载器中并执行一些任务.任务完成后,我想处理类加载器.我尝试通过将引用设置为null来做到这一点.
但这并不是垃圾收集类加载器.
有没有办法可以帮助我想达到的目标?
我有一个应用程序,允许使用抽象类,人们编写自己的实现.我从目录中将这些实现加载为.class-files.目前,我有这个解决方案:
File classDir = new File("/users/myproject/classes/");
URL[] url = { classDir.toURI().toURL() };
URLClassLoader urlLoader = new URLClassLoader(url);
String filename;
for (File file : classDir.listFiles()) {
filename = string.getFilenameWithoutExtension(file);
if (filename.equals(".") || filename.equals("..") || filename.startsWith("."))
continue;
AbstractClass instance = (AbstractClass)urlLoader
.loadClass("org.mypackage." + filename)
.getConstructor(ConfigUtil.class, DatabaseUtil.class, StringUtil.class)
.newInstance(config, database, string));
instance.doSomething();
}
Run Code Online (Sandbox Code Playgroud)
如您所见 - 我需要指定类所在的包,以便正确加载它们.省略了包裹,我得到了一个
java.lang.NoClassDefFoundError:
MyClass (wrong name: org/mypackage/MyClass)
Run Code Online (Sandbox Code Playgroud)
错误.
现在,从建筑POV来看,我认为设计其他人的类在加载时必须编译为MY包,这是非常糟糕的设计.
所以我问你:有没有办法从文件系统加载类而不必指定它们所在的包?
我有小问题.我学习java SE并找到类ClassLoader.我尝试在下面的代码中使用它:我正在尝试使用URLClassLoader在运行时动态加载类.
URLClassLoader urlcl = new URLClassLoader(new URL[] {new URL("file:///I:/Studia/PW/Sem6/_repozytorium/workspace/Test/testJavaLoader.jar")});
Class<?> classS = urlcl.loadClass("michal.collection.Stack");
for(Method field: classS.getMethods()) {
System.out.println(field.getName());
}
Object object = classS.newInstance();
michal.collection.Stack new_name = (michal.collection.Stack) object;
Run Code Online (Sandbox Code Playgroud)
java虚拟机看不到我的类,我得到以下异常:
Exception in thread "main" java.lang.Error: Unresolved compilation problems: michal cannot be resolved to a type michal cannot be resolved to a type at Main.main(Main.java:62)
Run Code Online (Sandbox Code Playgroud)
你知道我怎么解决这个问题吗?
我正在尝试在隔离的类加载器中运行groovy脚本,以便它们不会在调用类的依赖项的上下文中执行.
Path log4j = Paths.get("..../lib/log4j-1.2.17.jar");
Path groovy = Paths.get("..../lib/groovy-all-2.1.3.jar");
RootLoader rootLoader = new RootLoader(new URL[] { log4j.toUri().toURL(), groovy.toUri().toURL() }, null);
GroovyScriptEngine engine = new GroovyScriptEngine(".../src/main/resources", rootLoader);
engine.run("Standalone.groovy", "");
Run Code Online (Sandbox Code Playgroud)
Standalone.groovy:
import org.apache.log4j.BasicConfigurator
import org.apache.log4j.Logger
Logger logger = Logger.getLogger(getClass())
BasicConfigurator.configure()
logger.info("hello world")
Run Code Online (Sandbox Code Playgroud)
pom.xml摘录:
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.1.3</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我试过的上述任何变化都会导致
Exception in thread "main" groovy.lang.GroovyRuntimeException: Failed to create Script instance for class: class Standalone. Reason: java.lang.ClassCastException: Standalone cannot be cast to groovy.lang.GroovyObject
at org.codehaus.groovy.runtime.InvokerHelper.createScript(InvokerHelper.java:443)
at groovy.util.GroovyScriptEngine.createScript(GroovyScriptEngine.java:564)
at groovy.util.GroovyScriptEngine.run(GroovyScriptEngine.java:551)
at groovy.util.GroovyScriptEngine.run(GroovyScriptEngine.java:537) …Run Code Online (Sandbox Code Playgroud) 我有一个类加载器问题与Java 9。
这段代码可用于以前的Java版本:
private static void addNewURL(URL u) throws IOException {
final Class[] newParameters = new Class[]{URL.class};
URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class newClass = URLClassLoader.class;
try {
Method method = newClass.getDeclaredMethod("addNewURL", newParameters );
method.setAccessible(true);
method.invoke(urlClassLoader, new Object[]{u});
} catch (Throwable t) {
throw new IOException("Error, could not add URL to system classloader");
}
}
Run Code Online (Sandbox Code Playgroud)
从这个线程中,我了解到必须将其替换为以下内容:
Class.forName(classpath, true, loader);
loader = URLClassLoader.newInstance(
new URL[]{u},
MyClass.class.getClassLoader()
Run Code Online (Sandbox Code Playgroud)
MyClass是我要在其中实现该Class.forName()方法的类。
u = file:/C:/Users/SomeUser/Projects/MyTool/plugins/myNodes/myOwn-nodes-1.6.jar
String classpath = URLClassLoader.getSystemResource("plugins/myNodes/myOwn-nodes-1.6.jar").toString();
Run Code Online (Sandbox Code Playgroud)
由于某些原因-我真的不知道为什么-在运行时我收到ClassNotFoundException Class.forName(classpath, …
我正在 Docker 映像中运行 Java 服务,其执行如下操作:
java -server -cp 'libs/*'
奇怪的是,我发现它会在我的本地计算机上启动,但不会在开发服务器上启动,在开发服务器上它会给出NoSuchMethodError.
经过一番挖掘,我发现 libs 目录中同时存在 JPA 2.0 和 2.1 版本。虽然这本身就是一个问题(并且很容易修复),但它并不能解释不一致的原因,所以我决定打印出来:
(ClassLoader.getSystemClassLoader() as URLClassLoader).urLs
.forEach(::println) // kotlin
Run Code Online (Sandbox Code Playgroud)
我发现两台机器上的库顺序不同。然而,在同一台机器上后续运行的图像之间是一致的,所以不是随机的。
虽然我现在知道为什么镜像无法在开发服务器上启动,并且我可以解决手头的问题,但它确实让我想知道:为什么这个顺序在 Docker 主机上不一致?可复现性和一致性不正是Docker的要点之一吗?类路径的顺序是否取决于 IP、主机名或安装的主机目录(在不相关的位置)等挑剔的事物?
我正在使用以下方法来调用jar文件中的类:
invokeClass("path.to.classfile", new String[] {});
public static void invokeClass(String name, String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, MalformedURLException {
File f = new File(System.getProperty("user.home") + File.separator + ".myapplication"+File.separator+"myjar.jar");
URLClassLoader u = new URLClassLoader(new URL[]{f.toURI().toURL()});
Class c = u.loadClass(name);
Method m = c.getMethod("main", new Class[] { args.getClass() });
m.setAccessible(true);
int mods = m.getModifiers();
if (m.getReturnType() != void.class || !Modifier.isStatic(mods) || !Modifier.isPublic(mods)) {
throw new NoSuchMethodException("main");
}
try {
m.invoke(null, new Object[] { args });
} catch (IllegalAccessException e) {
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以在单独的进程上调用它?那么正在运行的应用程序和新调用的应用程序没有任何共同之处? …
有没有办法告诉 Spring 在实例化 bean 时从给定的 URL 加载类?我需要从不在类路径中的位置加载类。如果我使用纯 Java,我可以使用,URLClassLoader但如何在 Spring 中实现这一点?我正在使用 Spring 3.0