标签: classloader

如何以编程方式查找主执行类的完整路径

我正在尝试以编程方式本地化一个属性文件,而不必将命令行上的完整路径名传递给我的程序.我想如果我能找到主类的路径,我可以将我的属性文件粘贴在同一目录或子目录中.

如果这不起作用,我可以通过其他方式找到属性文件的路径,而无需在命令行上传递它.

谢谢

java classpath classloader

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

如何发现哪个类路径条目提供了类?

我从Java中的自定义类加载器中加载了来自几个不同.jars的几个不同的类.我创建一个自定义URLClassLoader,向它添加几个.jars并将其传递给a ServiceLoader以找到我想要的类.

我的问题是:给定一个类,有没有办法发现它是从哪个.jar加载的?

java reflection jar classloader

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

打开文件; 首先尝试文件系统,然后尝试JAR

我正在尝试让我的应用程序透明地加载资源(二进制文件):

如果该文件存在于当前目录下,请将其打开.
如果没有,请尝试查看当前的JAR文件(如果适用).
如果没有,请尝试查看其他JAR文件.(这是可选的,我不介意明确指定哪些J​​AR文件.)

到目前为止,我知道File哪个打开一个本地文件,ClassLoader哪个有getResource*JAR内容.

是否有一个结合了两者的课程?如果没有,我该如何自己写呢?我应该写一个ClassLoader也检查本地文件系统?用File?(我对Java非常熟悉,甚至不知道返回什么样的好类型.InputStream?)

谢谢

PS"文件"我的意思是"路径",例如"data/texture1.png".

java jar classpath classloader

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

java.lang.LinkageError类加载错误

我的JSystem/Java/Eclipse环境有些问题.

我收到此错误,我不明白错误:

java.lang.LinkageError: loader constraint violation: loader (instance of jsystem/runner/loader/ExtendsTestCaseClassLoader) previously initiated loading for a different type with name "org/w3c/dom/Document"
Run Code Online (Sandbox Code Playgroud)

我想知道是否有人有类似的问题,我不认为我的环境对于解决它是非常重要的,如果我能理解发生了什么"undergound"我希望自己解决问题.

非常感谢提前.

java classloader

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

Tomcat6忽略web-inf/lib

简介: Tomcat6无法识别WebRoot/WEB-INF/lib中的ojdbc14.jar.我想我不需要配置任何东西,只需将.jar文件放在那里就可以了.

细节:

我已经创建了一个Web应用程序并将ojdbc14.jar放在WEB-INF/lib文件夹中.当我启动Tomcat6并访问一个index.jsp页面,该页面创建一个启动与我的oracle数据库连接的对象时,会出现错误,指出"无法加载JDBC驱动程序类'oracle.jdbc.OracleDriver'".显然Tomcat6无法识别web-inf/lib/ojdbc14.jar中的'oracle.jdbc.OracleDriver'类.

我做了一些研究并推测出以下原因:

  1. Tomcat6有一些不同的加载类的方法.他们在发布的每个版本中都会更改它 要么
  2. Tomcat6有一个错误.我在Tomcat3中发现了类似的错误(请参阅https://bugs.eclipse.org/bugs/show_bug.cgi?id=249044).但我怀疑这个bug可能会持续这么多版本.
  3. Tomcat6已将ojdbc14.jar的内容包含在自己的lib文件中,并且再次将其添加到web-inf/lib会产生冲突.我不相信这一点,因为从WEB-INF/lib删除ojdbc14.jar后,问题仍然存在.

这是我的Web应用程序结构:

  • 的WebRoot
    • WEB-INF
        • '启动连接的类'
      • LIB
        • 为ojdbc14.jar
    • 的index.jsp

错误:

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'oracle.jdbc.OracleDriver'
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:766)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
    at com.demo6.DataSourceExample.getConnection(DataSourceExample.java:18)
    at org.apache.jsp.index_jsp._jspService(index_jsp.java:63)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:384)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
    at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver
    at …
Run Code Online (Sandbox Code Playgroud)

java tomcat jdbc web-inf classloader

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

带有来自Jar的多个XML文件的Spring ApplicationContext

我需要使用当前Maven构建中的"main"applicationContext -a.xml创建一个ApplicationContext.另一个来自另一个maven构建的连接类,并在Maven依赖项包含的jar中预设.

这个想法:

ApplicationContext context = new ClassPathXmlApplicationContext( new String[] {
                "classpath*:applicationContext-*.xml"});
Run Code Online (Sandbox Code Playgroud)

这应该从Classpath加载applicationContext-a.xml,因为它在同一个Project中.这有效.

然后应该从dependency-jar加载applicationContext-b.xml. 这不起作用.

注意

"classpath*:applicationContext-*.xml"
Run Code Online (Sandbox Code Playgroud)

只匹配直接类路径中的XML,jar中没有任何内容.

我发现了什么:

ApplicationContext context = new ClassPathXmlApplicationContext( new String[] {
                "classpath*:applicationContext-*.xml", "classpath*:applicationContext-b.xml"});
Run Code Online (Sandbox Code Playgroud)

这是有效的,但前提是我可以在jar:applicationContext-b.xml中明确告诉xml的文件名

我还需要它来进行集成测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"**/applicationContext*.xml"})
public class TestClass { ... }
Run Code Online (Sandbox Code Playgroud)

最好的想法可能是自定义装载机?必须有一种方法来使这个模式工作......

前段时间有一个解决方案,反之亦然:它只从jar获取applicationContext.xml.如果类路径中有另一个,它只匹配此文件.

java spring classpath classloader applicationcontext

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

字节码注入在哪里发生?

动机

我有一个SomeObject.java文件:

class SomeObject {
   String name;
}
Run Code Online (Sandbox Code Playgroud)

编译它会创建一个包含字节码的SomeObject.class文件.

0xCAFEBABE...
Run Code Online (Sandbox Code Playgroud)

如果我们在JVM上使用SomeObject,它将由当前的类加载器加载,并且一切正常.

现在让我们假设我想要一些动态代码生成.我可以写我的自定义注释

@Target(ElementType.TYPE)
public @interface Data {
   ...
}
Run Code Online (Sandbox Code Playgroud)

并将其作为修饰符添加到类声明中:

@Data
class SomeObject {
   String name;
}
Run Code Online (Sandbox Code Playgroud)

我也可以在运行时保留它@Retention(RetentionPolicy.RUNTIME):

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Data {
   ...
}
Run Code Online (Sandbox Code Playgroud)

用于字节码注入的注释在哪里?在使用适当的运行时保留注释加载类时,类加载器是否会注入字节码,如下图所示:

source -(compile)-> bytecode -(classloader bytecode injection)-> injected bytecode -(classloading)-> JVM loaded bytecode   
Run Code Online (Sandbox Code Playgroud)

annotations bytecode classloader bytecode-manipulation

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

Java中的默认类加载器是否将所有内容保留在内存中或保留在文件系统中?

我想知道您是否有一个jar,可以动态地加载到正在运行的程序中,那么jar中的所有内容(类,资源)是否都存储在VM内存中的某个位置?

这样,每次您需要访问类或文本资源文件时(例如,通过getClass()。getResourceAsStream),都可以将其从内存中快速拉出,而不必再次访问文件系统中的jar?即您可以在此之后删除该jar。

抱歉,如果我问的是错误的问题,请改成解释类加载器过程的问题,因为我可能会误解它,尤其是对于jar中打包的资源。谢谢。

java jar classloader dynamic-loading dynamic-class-loaders

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

如何在Java中使用Custom ClassLoader到新的Object

我想创建一个自定义ClassLoader来加载某些路径中的所有jar文件(例如/ home/custom/lib).

那么我希望每次使用newoperator创建一个Object时,它都会在该路径中的所有jar文件中搜索类,然后搜索parameter(-cp)定义的类路径.

可能吗?

例如,有一个jar文件 /home/custom/lib/a.jar

在主类

public class Main {
    public static void main(String[] args) {
        // do something here to use custom ClassLoader
        // here will search Car in /home/custom/lib/a.jar first then in java class path
        Car car = new Car(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

java classloader

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

覆盖类加载器"Parent First"

我在Web应用程序服务器单节点设置上运行Java Web应用程序,其中我使用的是我在Web-Inf中包含的自由文件并在我的代码中使用.

问题是我有另一个应用程序将其库添加到WebSphere父lib文件夹,其中一个是我正在使用的相同的版本,但是使用旧版本,会产生冲突并干扰我的代码.

服务器类加载器配置为父首先不可取,我无法改变这一事实.我的问题是,如何让我的应用程序使用我的自由文件,忽略类加载器使用的那个?

java websphere classloader java-ee

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