您将如何确定从哪个类(或可能是资源)加载?
我正在尝试确切地从哪里加载一个类.有谁知道你是否能找到以下内容:
在我的一个JUnit测试中,我试图加载目录中包含的所有文件.我曾经.getClassLoader().getResource("otherresources")找到目录.然后我做了一个新的java.io.File.然后我用来listFiles()获取所有子文件,然后.getClassLoader().getResource()再次使用来加载每个文件.
URL url = FileLoadTest.class.getClassLoader().getResource("otherresources");
File directory = new File(url.getPath());
File[] files = directory.listFiles();
Run Code Online (Sandbox Code Playgroud)
基本上,我希望能够加载目录中的所有文件,而不知道它们究竟是什么.
我可以在Eclipse中正确运行测试.当我使用Maven(mvn install)构建项目或使用surefire(mvn -Dtest=FileTest test)自行运行测试用例时,测试用例失败了NullPointerException.我认为这个问题与File api在资源部署到的JAR文件中没有按预期工作有关.
有关如何解决此问题的任何提示?
我已经学会了如何动态地将".class"文件加载到我的程序中,但是如果我在tomcat上运行它就不起作用了.这是代码:
package testPackage;
public class ModuleEngine {
public static void main(String pth, String name) {
ModuleLoader loader = new ModuleLoader(pth, ClassLoader.getSystemClassLoader());
try {
Class clazz = loader.loadClass(name);
Protocol execute = (Protocol)clazz.newInstance();
execute.run();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
public class ModuleLoader extends ClassLoader {
private String pathtobin;
public ModuleLoader(String pathtobin, ClassLoader parent) {
super(parent);
this.pathtobin = pathtobin;
}
@Override
public Class findClass(String className) throws ClassNotFoundException …Run Code Online (Sandbox Code Playgroud) 请考虑以下情形:
我有两个java类,使用不同的系统类加载器加载.我有一个实现了队列的本机库.这两个类都将加载相同的库,并将元素添加到队列中.可能吗?如果是这样,将在两个类之间共享本机库实现.
我米试图aop.xml中外部化的配置,所以我删除了aop.xml从META-INF,并使其在服务器通过SYS管理员手工配置提供.
当我尝试使用外部aop.xml时
-Dorg.aspectj.weaver.loadtime.configuration="file:D:\Workspace\tomcat7\shared\lib\aop.xml"
Run Code Online (Sandbox Code Playgroud)
我java.lang.RuntimeException: Cannot register non aspect: aspectclass....主要是因为当时尚未加载aj casses AppClassLoader.并且下次它尝试从WebAppClassLoader(在加载所有类之后)注册方面时,它工作正常,但我仍然从第一次尝试注册它时记录了异常.
在ClassLoaderWeavingAdaptor.java第307行捕获并记录异常.
当调用以下行时:success = registerAspects(weaver,loader,definitions);
捕获并记录异常.
try {
registerOptions(weaver, loader, definitions);
registerAspectExclude(weaver, loader, definitions);
registerAspectInclude(weaver, loader, definitions);
success = registerAspects(weaver, loader, definitions);
registerIncludeExclude(weaver, loader, definitions);
registerDump(weaver, loader, definitions);
} catch (Exception ex) {
trace.error("register definition failed", ex);
success = false;
warn("register definition failed", (ex instanceof AbortException) ? null : ex);
}
Run Code Online (Sandbox Code Playgroud)
异常在BcelWeaver.java的以下行中精确抛出
if (type.isAspect()) {
......
} else { …Run Code Online (Sandbox Code Playgroud) 当我将我的webapp部署到Tomcat时,我遇到一个奇怪的错误,我相信类加载器问题.当我使用Jetty在本地运行我的webapp时,不会出现该错误.似乎我的.yml资源文件的输入流由于某些原因而被关闭.当我尝试将单个模块项目转换为多模块项目时,首先出现此错误.在此之前,它使用完全相同的代码在Tomcat上正常工作:
Caused by: org.yaml.snakeyaml.error.YAMLException: java.io.IOException: Stream closed
at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:200)
at org.yaml.snakeyaml.reader.StreamReader.<init>(StreamReader.java:60)
at org.yaml.snakeyaml.Yaml.load(Yaml.java:412)
at com.config.ConfigProvider.<init>(ConfigProvider.java:20)
... 49 more
Caused by: java.io.IOException: Stream closed
at java.io.PushbackInputStream.ensureOpen(PushbackInputStream.java:57)
at java.io.PushbackInputStream.read(PushbackInputStream.java:149)
at org.yaml.snakeyaml.reader.UnicodeReader.init(UnicodeReader.java:90)
at org.yaml.snakeyaml.reader.UnicodeReader.read(UnicodeReader.java:122)
at java.io.Reader.read(Reader.java:123)
at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:184)
... 55 more
Run Code Online (Sandbox Code Playgroud)
这是导致错误的行:
String s = ConfigProvider.getConfig().getString("test");
Run Code Online (Sandbox Code Playgroud)
这是ConfigProvider班级.它基本上扫描正则表达式的所有资源文件^.*\\.config\\.yml$,将其转换为a Map<String, Object>,并将获得的所有资源组合Map<String, Object>成一个Map<String, Object>:
1 public class ConfigProvider {
2 protected static final String CONFIG_PACKAGE = ConfigProvider.class.getPackage().getName();
3 protected static final Pattern CONFIG_PATH_REGEX = Pattern.compile("^.*\\.config\\.yml$");
4
5 …Run Code Online (Sandbox Code Playgroud) 在一个Java servlet容器中(最好是Tomcat,但是如果这可以在另一个容器中完成,那么这样说)我希望理论上可行的东西.我的问题是,是否存在支持它的工具,以及是否存在哪些工具(或者我应该进一步研究哪些名称).
这是我的问题:在一个servlet容器中,我想运行大量不同的WAR文件.它们共享一些大型公共库(例如Spring).乍一看,我有两个不可接受的选择:
在每个WAR文件中包含大型库(例如Spring).这是不可接受的,因为它会加载大量的Spring副本,耗尽服务器上的内存.
将大型库放在容器类路径中.现在所有WAR文件共享一个库实例(好).但这是不可接受的,因为我无法在不升级所有WAR文件的情况下升级Spring版本,并且如此大的改变难以实现.
但理论上,有一种替代方案可行:
"魔术"必须在容器级别完成(我认为),因为这只能通过使用不同的类加载器加载库的每个版本来实现,然后调整每个WAR文件可见的类加载器.
所以,你有没有听说过这样做?如果是这样,怎么样?或者告诉我它叫什么,这样我就可以进一步研究.
我试图访问Java应用程序中的资源(标记为)文件夹,但没有任何作用,返回错误的路径
我试过了:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
System.out.println(classLoader.getResource("."));
Run Code Online (Sandbox Code Playgroud)
和
ClassLoader classLoader = Config.class.getClassLoader();
System.out.println(classLoader.getResource("."));
Run Code Online (Sandbox Code Playgroud)
但它告诉我
file:/D:/testProject/build/classes/main/,当然没有资源文件:(
如何准确访问resources文件夹?
-TestProject
|-resources
|-src
|-main
Run Code Online (Sandbox Code Playgroud) 我目前正在编写一个程序来读取java类文件.目前,我正在读取类文件的Constant-Pool(在此处阅读)并将其打印到控制台.但是当它被打印出来时,一些unicode似乎以这种方式弄乱我的终端,它看起来像这样(如果重要的话,我正在阅读的类文件是从Kotlin编译的,而终端I我使用的是IntelliJ IDEA终端,虽然在使用常规Ubuntu终端时似乎没有出现问题.):
我注意到的是一个奇怪的Unicode序列,我认为它可能是某种逃逸序列.
这是没有奇怪的unicode序列的整个输出:
{1=UTF8: (42)'deerangle/decompiler/main/DecompilerMainKt', 2=Class index: 1, 3=UTF8: (16)'java/lang/Object', 4=Class index: 3, 5=UTF8: (4)'main', 6=UTF8: (22)'([Ljava/lang/String;)V', 7=UTF8: (35)'Lorg/jetbrains/annotations/NotNull;', 8=UTF8: (4)'args', 9=String index: 8, 10=UTF8: (30)'kotlin/jvm/internal/Intrinsics', 11=Class index: 10, 12=UTF8: (23)'checkParameterIsNotNull', 13=UTF8: (39)'(Ljava/lang/Object;Ljava/lang/String;)V', 14=Method name index: 12; Type descriptor index: 13, 15=Bootstrap method attribute index: 11; NameType index: 14, 16=UTF8: (12)'java/io/File', 17=Class index: 16, 18=UTF8: (6)'<init>', 19=UTF8: (21)'(Ljava/lang/String;)V', 20=Method name index: 18; Type descriptor index: 19, 21=Bootstrap method attribute index: 17; NameType index: 20, 22=UTF8: (15)'getAbsolutePath', 23=UTF8: …Run Code Online (Sandbox Code Playgroud) 我已经找到的所有文档都提到了“ jre / lib / ext”文件夹,但是在我的JRE 13安装中不存在。
我猜在Java 8(可以在jre / lib / ext中看到罐子)和Java 13之间的某个地方,它们移动了,但是我无法确定何时以及如何完成。
有人可以根据扩展类当前所在的位置来详细说明新JRE的情况吗?