标签: classloader

为什么 Java 类加载在 Linux 上会失败,但在 Windows 上会成功?

我有一个使用 Jetty 部署的 Java Web 应用程序(使用 Spring)。如果我尝试在 Windows 机器上运行它,一切都按预期工作,但是如果我尝试在我的 Linux 机器上运行相同的代码,它会像这样失败:

【正常启动输出】
11:16:39.657 INFO [main] org.mortbay.jetty.servlet.ServletHandler$Context.log>(ServletHandler.java:1145)>16> 设置 Web 应用程序根系统属性:'webapp.root' = [/path/到/工作/目录]
java.lang.reflect.InvocationTargetException
        在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        在 java.lang.reflect.Method.invoke(Method.java:597)
        在 org.mortbay.start.Main.invokeMain(Main.java:151)
        在 org.mortbay.start.Main.start(Main.java:476)
        在 org.mortbay.start.Main.main(Main.java:94)
引起:java.lang.ExceptionInInitializerError
        在 org.springframework.web.util.Log4jWebConfigurer.initLogging(Log4jWebConfigurer.java:129)
        在 org.springframework.web.util.Log4jConfigListener.contextInitialized(Log4jConfigListener.java:51)
        在 org.mortbay.jetty.servlet.WebApplicationContext.doStart(WebApplicationContext.java:495)
        在 org.mortbay.util.Container.start(Container.java:72)
        在 org.mortbay.http.HttpServer.doStart(HttpServer.java:708)
        在 org.mortbay.util.Container.start(Container.java:72)
        在 org.mortbay.jetty.Server.main(Server.java:460)
        ……还有 7 个
引起:org.apache.commons.logging.LogConfigurationException: org.apache.commons.logging.LogConfigurationException: 没有合适的日志构造函数 [Ljava.lang.Class;@15311bd for org.apache.commons.logging.impl.Log4JLogger (Caused通过 java.lang.NoClassDefFoundError: org/apache/log4j/Category) (由 org.apache.commons.logging.LogConfigurationException 引起:没有合适的日志构造函数 [Ljava.lang.Class;@15311bd for org.apache.commons.logging。 impl.Log4JLogger(由 java.lang.NoClassDefFoundError 引起:org/apache/log4j/Category))
        在 org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:543)
        在 org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:235)
        在 org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:209)
        在 …

java cross-platform classloader

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

如何重新加载属性文件而不重新启动Tomcat

我使用以下方法从classpath加载属性文件:

    String cheminFichier = new StringBuilder(100).append(classeBP.getPackage().getName().replace(".", "/")).append(File.separator).append(
        REPERTOIRE_MAPPING).append(nomFichier).append(".properties").toString();
    InputStream isMapping = Thread.currentThread().getContextClassLoader().getResourceAsStream(cheminFichier.toString());
    if (isMapping == null)
    {
        throw new ServiceMappingException("Erreur lors du chargement du mapping du service. Le fichier "
            + cheminFichier + " n'existe pas.");
    }
    else
    {
        Properties mapping = new Properties();
        try
        {
            mapping.load(isMapping);
        }
        catch (IOException e)
        ...
    }
Run Code Online (Sandbox Code Playgroud)

好的,这是工作.但是,如果我在运行Tomcat时修改属性文件的内容,则会忽略更改.它不像课程一样热重新加载.

我的上下文配置了reloadable="true"选项,Thread.currentThread()返回了类加载器.getContextClassLoader()是WEBAPP类加载器(不是系统类加载器或其他).

我读过可以使用ServletContext.getResourceAsStream,但我无法访问servlet上下文.

这是Tomcat 5.5.

任何的想法 ?如果没有,您是否有强制重新加载特定资源(我的属性文件)的解决方案?

谢谢 !

java tomcat classloader

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

ClassLoader.load(name)和Class.forName(name)之间的区别是什么

可能重复:
使用ClassLoader和Class.forName加载类之间的差异

AFAIK,java中提供了两种方法来从其名称初始化一个类.

  • public static Class forName(String className)抛出ClassNotFoundException

  • public static Class forName(String name,boolean initialize,ClassLoader loader)抛出ClassNotFoundException

  • ClassLoader:

    public class loadClass(String name)throws ClassNotFoundException {return loadClass(name,false); }

已知的是在forName方法中,我们可以将initialize的标志指定为false,这将跳过为该类初始化的一些静态事物.但还有什么呢?我应该如何正确使用它们?

你可以展示一些很好的例子.

谢谢!

更新:

提出问题之后,我做了一些简单的classLoader测试.

ClassLoader cls = ClassLoader.getSystemClassLoader(); 
        Class someClass = cls.loadClass("Test");         
        Class someClass0= Class.forName("Test");        
        Class someClass1= Class.forName("Test",false,cls);


        URL[] urls = new URL[] {new File("bin/").toURL()}; 
        ClassLoader cls2 = new URLClassLoader(urls, null); 
        Class someClass2 = cls2.loadClass("Test");         

        ClassLoader cls3 = new URLClassLoader(urls, cls); 
        Class someClass3 = cls3.loadClass("Test");         

       System.out.println(someClass.equals(someClass0));       
       System.out.println(someClass.equals(someClass1));
       System.out.println(someClass.equals(someClass2)); 
       System.out.println(someClass.equals(someClass3)); …
Run Code Online (Sandbox Code Playgroud)

java classloader

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

Java JAR保护

我编写了一个Java应用程序,我计划在线发布它.每个版本都将使用我制作的秘密序列密钥锁定.

我需要从反编译器等保护我的jar文件.这是我到目前为止所做的:

  1. 用户将其序列密钥输入表单
  2. 串口通过php脚本发送到我的开发服务器
  3. 该脚本生成一个新的jar bin文件,该文件在AES 128中加密
  4. 我的"loader"将jar文件作为字节下载并解密.
  5. 它调用main方法.
  6. 用户可以随意使用该应用
  7. 用户关闭应用程序
  8. 缓存被清除,一切都返回到步骤1或之前.

我做了1〜3步,但我需要知道是否有可能使,抓住从HTTP字节,解密它们,并调用main方法的定制ClassLoader.由于文件是完全加密的(在PHP服务器上保存为bin),我不能使用基本的类加载器.关于步骤8,是否可以从计算机的内存中卸载内容?

java classloader urlclassloader source-code-protection

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

如何在android ICS上使用'exec app_process'启动jar

我有3个设备.

1.base on cm9(android 4.0.4).

2.htcg14(android 4.0.3)

3.moto me525基于miui(android 2.2)

他们都扎根了.

我在设备1和3的终端上执行以下代码,过程正常.但设备2,它不起作用.

su
export CLASSPATH=/sdcard/foo.jar
exec app_process /system/bin xx.xx.Test '$@'
Run Code Online (Sandbox Code Playgroud)

日志

W/dalvikvm(12364): Exception Ljava/lang/NullPointerException; thrown while initializing Ljava/lang/System;
W/dalvikvm(12364): Exception Ljava/lang/ExceptionInInitializerError; thrown while initializing Ljava/lang/ClassLoader$SystemClassLoader;
W/dalvikvm(12364): WARNING: system class loader is NULL (setting main ctxt)
W/dalvikvm(12364): Warning: tracked references remain post-initialization
W/dalvikvm(12364): MAIN reference table (0xf9a388) dump:
W/dalvikvm(12364):   Last 1 entries (of 1):
E/dalvikvm(12364): Class lookup Ljava/lang/Daemons; attempted with exception pending
W/dalvikvm(12364): Pending exception is:
I/dalvikvm(12364): java.lang.ExceptionInInitializerError:
I/dalvikvm(12364):     at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:125) …
Run Code Online (Sandbox Code Playgroud)

android jar process classloader

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

Class.forName()和ClassNotFoundException

说我有以下两个类:

public class MyClass {
    public String getDescription() {
        return "MyClass";
    }
}
Run Code Online (Sandbox Code Playgroud)

public class MyClassLoader {
    public static void main (String[] argv) throws ClassNotFoundException {
        Class.forName("MyClass");
        System.out.println("MyClass class was successfully loaded");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果这两个类都在默认包中,它运行正常,类加载,世界是美丽的.(如果我要删除课程MyClass,我会ClassNotFoundException按预期得到一个.

但是,如果它们都在一个包中(假设它是Eclipse中的一个包),并且有

package myClassTestPackage;
Run Code Online (Sandbox Code Playgroud)

在两者中声明,ClassNotFoundException当我尝试运行它时,我得到了一个.

导致此问题的原因是什么?如何解决?这是我能够重现我在一个更大的程序中遇到的错误的最简单方法.

java exception classloader

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

Webstart 应用程序:SecurityException: setContextClassLoader

我有一个连接到 Web 服务的 webstart 应用程序。清单有:

Permissions: all-permissions
Run Code Online (Sandbox Code Playgroud)

jnlp 有:

<security>
  <all-permissions/>
</security>
Run Code Online (Sandbox Code Playgroud)

但是,当创建到 Web 服务的连接时,我得到了一个java.lang.SecurityException: setContextClassLoader(完整的堆栈跟踪如下)。当我直接运行应用程序(没有 webstart)时,它工作正常。有什么我应该检查或更改我的设置来解决问题的吗?

注意:我使用的是 Java 8。该应用程序在构建 121 时运行良好,但在构建 123、124 或 125(最新的)时失败。所以要么我的设置很好并且在 b121 和 b123 之间引入了一个错误,要么在 b123 中修复了一个错误,这暴露了我的设置中的问题。

org.glassfish.hk2.api.MultiException: A MultiException has 2 exceptions.  They are:
1. java.lang.SecurityException: setContextClassLoader
2. java.lang.IllegalStateException: Unable to perform operation: create on org.jvnet.hk2.internal.DynamicConfigurationServiceImpl

    at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:362) ~[na:na]
    at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:454) ~[na:na]
    at org.jvnet.hk2.internal.SingletonContext.findOrCreate(SingletonContext.java:119) ~[na:na]
    at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2296) ~[na:na]
    at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:590) ~[na:na]
    at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:577) ~[na:na]
    at org.glassfish.hk2.utilities.ServiceLocatorUtilities.enablePerThreadScope(ServiceLocatorUtilities.java:89) ~[na:na]
    at org.glassfish.jersey.internal.inject.Injections._createLocator(Injections.java:144) ~[na:na]
    at org.glassfish.jersey.internal.inject.Injections.createLocator(Injections.java:137) …
Run Code Online (Sandbox Code Playgroud)

java securityexception classloader java-web-start

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

Java URLClassLoader ClassNotFoundException

我必须.jar class loader在学校的作业中写一个。我在另一个问题中找到了这段代码,但不知道为什么它不起作用。

我已将路径设置为绝对路径,以确保它引用正确的文件。

System.out.println("Loading game: " + name);
URL url = new URL("file:///home/<name>/Documents/School/thema2.3/batavus/batavus/gamemodules/TicTacToe.jar");
ClassLoader loader = new URLClassLoader(new URL[]{url});
Class<?> clazz = loader.loadClass("spatboard.game." + name);
Class<? extends Game> boardClass = clazz.asSubclass(Game.class);
Constructor<? extends Game> ctor = boardClass.getConstructor();
return ctor.newInstance(board);
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

Loading game: TicTacToe
java.lang.ClassNotFoundException: spatboard.game.TicTacToe
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at spatbord.loader.GameLoader.loadModule(GameLoader.java:29)
at spatbord.model.Board.<init>(Board.java:51)
at spatbord.controller.GameController.onMatchStarted(GameController.java:157)
at spatbord.connection.Server.matchStarted(Server.java:428)
at spatbord.connection.Server.handleInput(Server.java:346)
at spatbord.connection.Server.run(Server.java:145)
at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)

中的包声明TicTacToepackage spatbord.game;

罐子的内容是:

spatbord
 -> game
  -> TicTacToe.class
Run Code Online (Sandbox Code Playgroud)

我在这里看不到什么?

java jar classloader

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

WAR 类从其他 WAR 访问另一个类

我是一个Jboss Wildfly 8.2实例,我有一个 webappROOT.war和另一个OTHER.war,我需要OtherXYZ.class里面的类OTHER.war能够访问RootXYZ.class. 我在某处读到过使用EAR这可能是可能的,但我不知道如何。

这是我需要实现的架构

                     ClassesVisibleToAllWars.jar
                     /          |              \    
            (access)/           |(access)       \(access)
                   /            |                \
            Root.war         Other1.war         Other2.war
           /                    |                    |
        R.class              O1.class              O2.class  
Run Code Online (Sandbox Code Playgroud)
  • 不能创建/使用全局模块来放入wildfly/modules目录。我只能访问standalone/deployments/*目录
  • 例如,从、和 开始的所有类都ClassesVisibleToAllWars.jar必须可见R.classO1.classO2.class
  • 新的其他.war文件可能最终会被部署,并且这种行为必须持续存在

ClassesVisibleToAllWars.jar为了实现该模式,我应该放在哪里?

java jboss war classloader wildfly-8

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

Java - 父类的类加载导致 ClassNotFoundException

我目前正在为 Java 程序制作一个小型插件框架。基本上GRPluginManager.loadPlugins()循环遍历目录中的所有 jar 文件,然后从 jar 内的特定文件中读取此插件的 Main-class 的名称并将其加载到类路径中。之后它调用enable()这个 plugin-Main-class 的方法(它扩展了GRPlugin)。

但是,它不起作用。看起来插件主类的加载工作正常,只有父类 ( GRPlugin) 找不到。但它绝对存在。

插件程序

package io.github.grengine.core.plugins;

public class GRPlugin {

    public void enable(){

    }

    public void disable(){

    }
}
Run Code Online (Sandbox Code Playgroud)

插件管理器.java

package io.github.grengine.core.plugins;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

import org.bukkit.plugin.java.JavaPluginLoader;
import org.yaml.snakeyaml.Yaml;

import io.github.grengine.JarUtils;
import io.github.grengine.Log;
import io.github.grengine.Main;

public class GRPluginManager {

    private static final …
Run Code Online (Sandbox Code Playgroud)

java classloader

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