问题1:我们知道,当一个类加载器即将加载一个类时,它会将请求委托给它的父类加载器.但是在Tomcat中,它不会:您可以加载您的类来覆盖放在通用lib目录中的同一个名称类.这意味着Tomcat WebappClassloader不遵循委派政策.这违反了惯例吗?
问题2:我写了一个类并将其放在通用的lib目录中,显然这个类是在web应用程序之间共享的.例如,每个Web应用程序都可以读取/写入类的静态字段.此外,JDK中的类由Bootstrap类加载器加载,然后它们的静态字段由任何Web应用程序共享,这是危险的吗?
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class JarClassLoader extends ClassLoader {
private String path;
public JarClassLoader(String path) {
this.path = path;
}
@Override
public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{
Class<?> c = findLoadedClass(name);
if (c == null) {
try {
c = findSystemClass(name);
} catch (Exception e) {
}
if (c != null)
return c;
try {
byte data[] = loadClassData(name);
c = defineClass(name, data, 0, data.length);
if (c == …Run Code Online (Sandbox Code Playgroud) 我正在创建一个Grails插件作为复杂产品的包装器.该产品与hibernate等其他产品有很多依赖关系.问题是,grails具有一些相同的依赖关系,但具有不同的版本.例如Grails - > hibernate 3.6.7其他产品 - > hibernate 3.5.6
Grails如何处理插件依赖项?Grails会为每个插件创建一个单独的ClassLoader吗?它是可配置的吗?
提前致谢!
有没有办法确定哪个ClassLoader加载特定的类?或者更具体地说,从特定类加载的位置?
我有一个加载旧的db驱动程序类的情况.我想找到加载旧驱动程序的文件.
我最初的方法是在ClassLoader.loadClass(..)方法上设置一个调试点,并在加载类后停止vm,看看哪个类加载器正在加载它.不幸的是,loadClass方法经常被调用,很难在类加载的地方停止.我将尝试设置断点过滤器.但是,还有另一个问题:由于ClassLoader体系结构,即使ClassLoader不负责加载,也会调用loadClass.
必须有更好的方法来实现我想要的.您是否有想法或建议在哪里寻找解决方案?
我正在尝试在/src/main/resources/file.txt中读取我的maven项目中的文件.
我正在使用
URL url=this.getClass().getResource("/");
String filePath=url.getPath()+"file.txt";
Run Code Online (Sandbox Code Playgroud)
当通过eclipse运行时,url对象获取正确的值.
但是,当我打包jar并在命令行中运行它时:
jar -cp myjar.jar SampleTest
Run Code Online (Sandbox Code Playgroud)
它为'url'对象返回null并在下一行中抛出NullPointerException.
我使用文件浏览器打开了我的Jar文件并进行了检查.它在Jar内的"/"位置有'file.txt'.
我哪里错了?
我正在阅读Java中的类加载.
假设我们有一个看起来像这样的类加载器层次结构,我理解加载的类First不能由加载的类直接访问Second(反之亦然).
Bootstrap
|
System
|
Common
/ \
First Second
Run Code Online (Sandbox Code Playgroud)
我也理解一个类加载器检查它的父类加载器是否可以加载该类,如果是这种情况,则将加载委托给它的父类.
类加载器如何确定它们是否可以加载某个给定的类?
是否有配置反射库的解决方案,以便它也扫描在运行时使用 URLClassLoader 添加的 JAR?
现在,反射只是扫描 ClassLoader 中的 URL。这是我现在使用的配置:
Reflections reflections = new Reflections(new ConfigurationBuilder().setUrls(ClasspathHelper.forClassLoader()));
Run Code Online (Sandbox Code Playgroud)
我在反射库的文档中找不到任何提示。
编辑: 这就是我加载 jar 文件的方式:
File f = new File("C:/Users/mkorsch/Desktop/test-reflections.jar");
URLClassLoader urlCl = new URLClassLoader(new URL[] {f.toURI().toURL()},System.class.getClassLoader());
Run Code Online (Sandbox Code Playgroud) 我有一个 Web 应用程序,我的要求是在应用程序启动时读取一些文件并对其进行处理并将文件内容保存在数据库中。
class MyUtil{
/**
*Read the files
*/
public static void readFiles(){
File file = new File(ClassLoader.getSystemClassLoader().getResource("MyFile").toURI()); //NullPointerException
// ClassLoader.getSystemClassLoader().getResource("MyFile") is giving null in servlet.init() method.
if (file.isDirectory()) {
//Read all the files and persist.
}
}
}
Run Code Online (Sandbox Code Playgroud)
MyFile 文件夹/目录在类路径中可用。当MyUtil.readFiles()被称为JUnit测试情况下,它工作正常。但是当它在servelet.init()方法中被调用时ClassLoader.getSystemClassLoader().getResource("MyFile")会给出空值。
我已经定义了自定义配置和依赖项.
repositories {
mavenCentral()
}
configurations {
myConfig
}
dependencies {
myConfig 'org.foo:foo:+'
}
Run Code Online (Sandbox Code Playgroud)
如何创建ClassLoader以动态加载类?
task myTask {
def classLoader = configurations.myConfig.????
def foo = Class.forName( "org.foo.Foo", true, classLoader ).newInstance();
}
Run Code Online (Sandbox Code Playgroud) classloader ×10
java ×8
jvm ×2
class ×1
classpath ×1
dependencies ×1
gradle ×1
grails ×1
jar ×1
junit ×1
maven ×1
reflections ×1
runtime ×1
servlets ×1
tomcat ×1