在我的战争中,Weblogic类加载器似乎更喜欢系统库而不是库WEB-INF/lib/.
我尝试过设置以下内容WEB-INF/weblogic.xml,但没有成功:
<weblogic-web-app>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>
Run Code Online (Sandbox Code Playgroud)
这只是给了我很多验证错误:
exception is java.lang.VerifyError: (class: org/apache/xerces/parsers/AbstractSAXParser, method: parse signature: (Lorg/xml/sax/InputSource;)V) Incompatible object argument for function call
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:730)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:196)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:907)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
Truncated. see log file for complete stacktrace
Run Code Online (Sandbox Code Playgroud)
(我试图避免将WAR打包到EAR中.)
一般问题: 是否可以使用ClassLoader替换预加载(通过系统,例如在Android的%android%/ frameworks/base/preloaded-classes文件中找到)类?
具体: 我试图在我的应用程序中创建WebView之前使用DexClassLoader替换android.net.*中找到的类.我可以得到一个Class对象,但getMethods()例如给了我一个我希望在未修改/原始类实现中的数组.这是由于preloaded-classes系统吗?
基本设置和伪代码:
我可以提供有关我正在使用的设置和代码的更多详细信息(如果需要).
我一直在我们的应用程序中处理类加载器泄漏,最终达到了对CL的所有引用都消失的程度.在我的内存分析工具(使用YourKit和jmap/jhat)中,我可以强制GC有时会立即摆脱我的类加载器,但其他时候(取决于应用程序使用情况,但这是我可以得到的具体)当我强制GC,CL实例不会消失.我捕获一个内存快照并查看结果,它说该对象存在,但无法访问.
这是古怪的部分......我只是偶然发现了这一点.
我可以强制使用我想要的全部GC,但实例并没有消失.然而,在10-20分钟之后,如果我再做一次完整的GC,它确实会被收集.
(在此期间,申请大部分是不活动的(并非完全).我的"延长"咖啡休息时间是导致这一发现的事故.)
所以我对这里泄漏的担忧已经消失(希望如此),但问题现在更多是试图解释这种行为.
任何人都知道什么可能导致太阳JVM决定不收集无法访问的类加载器20分钟?
Sun JVM版本详细信息:
java version "1.6.0_23"
Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
Java HotSpot(TM) 64-Bit Server VM (build 19.0-b09, mixed mode)
Run Code Online (Sandbox Code Playgroud) 我正在使用以下代码HashMap<String, String从包中读取类型> 的地图:
in.readHashMap(HashMap.class.getClassLoader());
Run Code Online (Sandbox Code Playgroud)
这似乎工作得很好,但我得到一个警告:
Type safety: The expression of type HashMap needs unchecked conversion to conform to Map<String,String>
Run Code Online (Sandbox Code Playgroud)
有没有"正确"的方法,使用不同的类加载器?或者我应该一起去@SuppressWarnings("unchecked")?
我在罐子里有一个类的方法,我想用自己的身体交换它.在这种情况下,我只想让方法将"GOT IT"打印到控制台并返回true;
我正在使用系统加载器来加载jar的类.我使用反射使系统类加载器能够通过字节码加载类.这部分似乎工作正常.
我按照这里找到的方法替换示例:asm.ow2.org/current/asm-transformations.pdf.
我的代码如下:
public class Main
{
public static void main(String[] args)
{
URL[] url = new URL[1];
try
{
url[0] = new URL("file:////C://Users//emist//workspace//tmloader//bin//runtime//tmgames.jar");
verifyValidPath(url[0]);
}
catch (Exception ex)
{
System.out.println("URL error");
}
Loader l = new Loader();
l.loadobjection(url);
}
public static void verifyValidPath(URL url) throws FileNotFoundException
{
File filePath = new File(url.getFile());
if (!filePath.exists())
{
throw new FileNotFoundException(filePath.getPath());
}
}
}
class Loader
{
private static final Class[] parameters = new Class[] {URL.class};
public static void addURL(URL …Run Code Online (Sandbox Code Playgroud) 如何通过ClassLoader或类似机制实例化Enum类型?(我试图将所有内容保存在独立服务器应用程序的相同上下文类加载器下).
我有类似的东西:
ClassLoader loader = new CustomClassLoader(parent, libDir);
Thread.currentThread().setContextClassLoader(loader);
// trouble area
Class<?> containerClass = loader.loadClass("com.somepackage.app.Name$SERVER");
Run Code Online (Sandbox Code Playgroud)
我错误地认为只需加载Enum就足以启动它(它的私有构造函数包含启动方法调用和什么不是).
执行上面的操作不会导致任何异常,但JVM只会在最后一行之后终止,并且服务器无法启动.
显然这样做:
containerClass.newInstance();
Run Code Online (Sandbox Code Playgroud)
抛出异常导致结果.
我有一个多模块构建SBT组成的api,core和third-party.结构大致如下:
api
|- core
|- third-party
Run Code Online (Sandbox Code Playgroud)
third-party实现的代码api和从其他地方逐字复制,所以我真的不想触摸它.
由于实施的方式third-party(大量使用单身人士),我不能只core依赖third-party.具体来说,我只需要通过它来使用它api,但我需要third-party在运行时拥有多个独立的副本.(这允许我同时拥有多个"单身人士".)
如果我在我的SBT构建之外运行,我只是这样做:
def createInstance(): foo.bar.API = {
val loader = new java.net.URLClassLoader("path/to/third-party.jar", parent)
loader.loadClass("foo.bar.Impl").asSubclass(classOf[foo.bar.API]).newInstance()
}
Run Code Online (Sandbox Code Playgroud)
但问题是,我不知道如何在运行时弄清楚URLClassLoader如果我正在运行,我应该给出什么作为参数sbt core/run.
我搜索了互联网超过几个小时,无法得出任何结论.
最近我决定使用BouncyCastle进行SSL,但我希望它默认关闭,这样BouncyCastle jar可能不在类路径中.
private void enableBouncyCastleForSSL() {
if (config.isBouncyCastleEnabled()) {
Security.insertProviderAt(new BouncyCastleProvider(), 1);
}
}
Run Code Online (Sandbox Code Playgroud)
即使配置被禁用,它也在寻找BouncyCastle并且它因类加载器错误而失败.java.lang.NoClassDefFoundError:org/bouncycastle/jce/provider/BouncyCastleProvider
我试着只移动Security.insertProviderAt(new BouncyCastleProvider(),1); 对于一种新的方法,它表现出同样的问题.
但是当我引入一个类并在其中移动BouncyCastle时,当配置被禁用时,类加载器问题不会出现
private void setupSSLProvider() {
if (voldemortConfig.isBouncyCastleEnabled()) {
SetupSSLProvider.useBouncyCastle();
}
}
public class SetupSSLProvider {
public static void useBouncyCastle() {
Security.insertProviderAt(new BouncyCastleProvider(), 1);
}
}
Run Code Online (Sandbox Code Playgroud)
有些文章声称Class仅在首次使用时加载.http://www.programcreek.com/2013/01/when-and-how-a-java-class-is-loaded-and-initialized/
显然,就我而言,Java8加载了类中引用的类.
所以我的理解是Java会在类中执行第一行代码之前将类加载一级.是对的吗 ?
我试图理解 Java 的ServiceLoader概念、工作机制和具体用例,但发现官方文档太抽象和混乱。
首先,文档概述了服务和服务提供商。服务是一组接口和抽象类,封装在一个 jar 档案(API 库)中。服务提供者是一组实现或扩展 API 的类,封装在一个不同的 jar 文件(提供者库)中。
到目前为止一切顺利,但随后文档变得混乱。
出于加载的目的,服务由单一类型表示,即单一接口或抽象类。(可以使用具体类,但不建议这样做。)给定服务的提供者包含一个或多个具体类,这些类使用特定于提供者的数据和代码扩展该服务类型。提供者类通常不是整个提供者本身,而是一个代理,它包含足够的信息来决定提供者是否能够满足特定请求以及可以按需创建实际提供者的代码。提供者类的细节往往是高度特定于服务的;没有任何一个类或接口可以统一它们,所以这里没有定义这样的类型。
那么实际上Service type和Provider class 是什么?我的印象是,服务类型是API 库中的一个门面,提供者类是提供者库中这个门面接口的实现,即ServiceLoader实际加载的类。这样对吗?但对我来说,所有组件如何联系在一起仍然没有多大意义。
提供者类作为代理来决定提供者是否能够满足特定请求以及可以按需创建实际提供者的代码是什么意思?无法在何处定义统一类型?基本上所有这一段都令人困惑,我想通过一个具体的例子听到更容易理解的解释。
然后关于提供者配置文件...
通过在资源目录 META-INF/services 中放置一个提供者配置文件来识别服务提供者。该文件的名称是服务类型的完全限定二进制名称。该文件包含具体提供者类的完全限定二进制名称列表,每行一个...
命名特定提供程序的配置文件不必与提供程序本身位于同一 jar 文件或其他分发单元中。提供者必须可以从最初查询以定位配置文件的同一个类加载器访问;请注意,这不一定是实际加载文件的类加载器。
这是否意味着对于服务类型为 org.foo.BarServiceType 的 API,在类路径中必须存在具有实现此类型的类的提供程序 jar和 META-INF/services/org.foo.BarServiceType列出此提供程序类的命名提供程序配置文件,所有这些都可以通过Classloader加载ServiceLoader查找的相同访问并在 API 上绑定提供者?
从类加载器的角度来看,可访问意味着提供者配置文件和提供者库可以在包的外部提供,在层次结构的上层,即从容器或其他中间件。
提供者配置文件列出了提供者类,并且可能捆绑在提供者包中(如果捆绑了为什么它会列出多个类?)或来自外部。但是哪种方法更常见:在提供者之间提供配置文件,还是从 API 库本身提供列出一组支持的提供者的文件?还是后者是一种误解?
最后关于 ServiceLoader
在哪里ServiceLoader实际实例化并调用以加载服务提供者?这是否发生在API 库提供的工厂方法中?例如,不LoggingFactory.getLogger(clazz)的SLF4J内部委托给ServiceLoader,它使用反射来读取提供者配置文件并加载服务?
服务加载机制如何处理存在多个提供者及其配置文件的情况,或者有提供者配置文件条目但没有类本身的情况?
ServiceLoader日志框架之外的其他一些具体用例是什么?它在Java …
classloader ×10
java ×8
android ×2
bytecode ×1
dex ×1
enums ×1
frameworks ×1
generics ×1
jar ×1
java-8 ×1
jvm ×1
openjdk ×1
parcelable ×1
reflection ×1
sbt ×1
scala ×1
web-inf ×1
weblogic ×1