标签: urlclassloader

class.jar中包含URLClassLoader的ClassNotFoundException(java.net包)

在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)

eclipse urlclassloader classnotfoundexception

6
推荐指数
1
解决办法
7205
查看次数

Java classLoader困境与锁定的罐子

我正在玩Java中的classLoaders并注意到一件奇怪的事情.如果classLoader从jar加载一个类,即使你没有引用你的classLoader,这个jar也会无限期地被锁定.

在下面的示例中,jar包含一个名为HelloWorld的类.我所做的是尝试通过classLoader加载jar中包含的类,该类动态地添加jar.如果设置skiptrue和不调用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)

java classloader urlclassloader

6
推荐指数
1
解决办法
4026
查看次数

处理类加载器

我正在使用扩展URLClassLoader的自定义类加载器.我将一些类加载到我的自定义类加载器中并执行一些任务.任务完成后,我想处理类加载器.我尝试通过将引用设置为null来做到这一点.

但这并不是垃圾收集类加载器.

有没有办法可以帮助我想达到的目标?

java dispose classloader urlclassloader

5
推荐指数
1
解决办法
1936
查看次数

从文件夹加载类而不指定包

我有一个应用程序,允许使用抽象类,人们编写自己的实现.我从目录中将这些实现加载为.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 classloader urlclassloader dynamic-class-loaders

5
推荐指数
1
解决办法
3876
查看次数

使用ClassLoader的Java示例

我有小问题.我学习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)

你知道我怎么解决这个问题吗?

java urlclassloader

5
推荐指数
1
解决办法
2万
查看次数

如何在隔离的类加载器中执行groovy脚本?

我正在尝试在隔离的类加载器中运行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 groovy classloader urlclassloader groovyclassloader

5
推荐指数
1
解决办法
428
查看次数

Java 9-在运行时动态添加jar

我有一个类加载器问题与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, …

java jar classloader urlclassloader java-9

5
推荐指数
1
解决办法
2310
查看次数

Docker 主机之间的 Java 类路径排序不一致

我正在 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、主机名或安装的主机目录(在不相关的位置)等挑剔的事物?

java classpath classloader urlclassloader docker

5
推荐指数
1
解决办法
469
查看次数

URLClassLoader + loadClass +在独立进程上调用main方法?Java的

我正在使用以下方法来调用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)

是否可以在单独的进程上调用它?那么正在运行的应用程序和新调用的应用程序没有任何共同之处? …

java process invoke urlclassloader

4
推荐指数
1
解决办法
1919
查看次数

如何从给定的 URL(用于 bean 实例化)使 Spring 加载类?

有没有办法告诉 Spring 在实例化 bean 时从给定的 URL 加载类?我需要从不在类路径中的位置加载类。如果我使用纯 Java,我可以使用,URLClassLoader但如何在 Spring 中实现这一点?我正在使用 Spring 3.0

java spring urlclassloader

4
推荐指数
1
解决办法
3218
查看次数