写了一个main函数
public static void main(String[] arg) throws Exception {
HSFContainerDelegator.start("D:\\j2ee_solution\\hsf-plugin");
System.out.println(Thread.currentThread().getContextClassLoader());
Class<?> clazz = Class
.forName("com.taobao.hsf.app.spring.util.HSFSpringConsumerBean");
System.out.println(clazz);
}
不在当前classpath中是通过osgi容器加载进来的,这个在main函数中能够正常使用,但是当使用jetty作为容器的web服务启动的时候,通过Spring来加载,就会抛出异常,如下:
public class HsfBootup implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
HSFContainerDelegator.start("D:\\j2ee_solution\\hsf-plugin");
Class<?> clazz = Class
.forName("com.taobao.hsf.app.spring.util.HSFSpringConsumerBean");
System.out.println("======================" + clazz);
}}
同样的代码,前一个是通过main函数启动,后一个是通过jetty间接使用spring来启动,但是后者会抛出异常。
为什么会这样呢?
那先看看两个场景下classloader有啥不同:
- main函数中的classloader是 sun.misc.Launcher$AppClassLoader@19821f
- jetty容器来加载的classloader是 class org.mortbay.jetty.webapp.WebAppClassLoader
恩,看来两个场景下的classloader是不一样的,应该是classloader不一样导致的class加载不到。
再来看一下第二个场景下因为加载不到class而抛出的异常信息:
java.lang.ClassNotFoundException: com.taobao.hsf.app.spring.util.HSFSpringConsumerBean
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at org.codehaus.classworlds.RealmClassLoader.loadClassDirect(RealmClassLoader.java:195)
at org.codehaus.classworlds.DefaultClassRealm.loadClass(DefaultClassRealm.java:255)
at org.codehaus.classworlds.DefaultClassRealm.loadClass(DefaultClassRealm.java:274)
at org.codehaus.classworlds.RealmClassLoader.loadClass(RealmClassLoader.java:214)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:401)
at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:363)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:211)
at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:385)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1138)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.j
ava:524)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1177)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:758)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:422
)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:72
8)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:548)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
在网上找到了jetty的classloader加载机制http://docs.codehaus.org/display/JETTY/Classloading ,这其中说到了org.mortbay.jetty.webapp.WebAppClassLoader是jetty的默认的classloader。
分享到:
相关推荐
- **HSF_Jetty插件**:该插件解决了开发过程中频繁重启服务器的问题,通过将Jetty集成到IDE中,可以实现实时热更新。 - **问题与解决方案**: - **依赖类**:在开发过程中,依赖的类可能需要动态加载。通过IDE提供...
总的来说,"taobao-hsf.sar"文件是HSF服务的载体,它的部署意味着HSF服务可以在Tomcat环境中运行,提供高效、稳定的分布式服务。对于开发者来说,理解和掌握HSF框架有助于构建可扩展、高可用的分布式系统,提升整体...
标题中的“taobao-HSF”指的是淘宝的High Speed Service(HSF)框架,它是一个高性能、高可用的服务治理框架,主要用于阿里巴巴集团内部的分布式服务调用。HSF提供了包括服务发现、服务调用、负载均衡、熔断保护等一...
3. **配置HSF依赖**:在`pom.xml`文件中添加HSF相关的依赖库,如HSF服务提供者和消费者的相关依赖。 4. **运行与调试**:通过IDEA的Run/Debug配置,可以方便地启动HSF服务提供者和消费者,进行本地测试和调试。 ###...
- **监控与日志**:启用HSF的日志和监控功能,以便于定位和解决问题。 - **服务测试**:在发布服务前,进行充分的单元测试和集成测试,确保服务的正确性。 总的来说,HSF接口的`.sar`包是HSF服务的重要组成部分,它...
理解和掌握HSF的使用方法,对于构建和维护大规模分布式系统至关重要,尤其是在阿里巴巴这样的电商环境中,HSF起到了关键的角色。通过深入学习和实践,你可以更好地驾驭这个强大的服务框架,提升系统的稳定性和效率。
淘宝的HSF框架,用户手册,有兴趣的人欢迎下载~内部文档哦~
编码规范是软件开发中的重要环节,对于HSF项目而言,遵循良好的编码规范能确保代码的可读性、可维护性和团队协作效率。编码规范通常包括命名规则、注释规范、代码结构、异常处理、类型转换、空指针检查等多个方面。...
在"EDAS-HSF-BOOT"项目中,我们可以看到"pandora-hsf-boot-demo"这个文件,这通常是一个示例项目,用于展示如何使用HSF-BOOT来创建和消费HSF服务。Pandora是阿里巴巴开源的分布式系统治理平台,它集成了HSF,可以...
1. **服务提供者**:首先,你需要在Spring Boot应用中定义HSF服务,通过HSF的API来暴露服务接口。这通常涉及编写服务接口类和服务实现类,然后使用HSF的注解或配置来标记为服务提供者。 2. **服务注册**:在HSF服务...
在Eclipse中使用HSFJetty插件,可以显著提升Java开发者在HSF和Jetty项目中的工作效率,简化开发流程,减少错误,并促进更好的代码质量和可维护性。对于那些需要处理HSF服务和Jetty应用的开发者来说,这是一个...
自己公司用的HSF架构培训手册,当时还有阿里的人来培训我们,希望帮助到需要用的HSF技术的人
- **目标**: HSF的主要目标是解决分布式应用中的通信问题,包括但不限于远程调用、服务发现与注册、负载均衡、故障恢复等。 - **特性**: - **高性能**: 通过高效的序列化协议和支持高并发处理能力实现。 - **轻量...
HSF 框架的原理讲解,主要包含了知识点:rpc,动态代理,HSF可以作为微服务的基础框架进行二次开发
在使用过程中,开发者需要将 "taobao-hsf" 包解压到阿里云定制的Tomcat容器——"Ali-Tomcat" 的部署目录"D:\work\tomcat\deploy" 下。这样做是为了让HSF服务能够在EDAS的容器中顺利运行,实现服务的发布和调用。 ...
这个程序的主要目的是确保在电气和电子设备行业中,按照RoHS(限制在电气和电子设备中使用某些有害物质指令)和其他相关法规的要求,正确制定、应用、存储和保护文件,以便随时获取正确有效的信息。 RoHS指令是一项...
2. **轻量级**:HSF不需要额外的中间件支持,可以直接在Java应用服务器上运行,降低了系统的复杂度。 3. **服务治理**:包括服务注册、发现、路由、负载均衡等,保证服务的稳定性和高可用性。 4. **容错机制**:HSF...
在实际应用中,使用HSF需要注意服务粒度的划分、接口设计的合理性、服务版本管理的策略以及监控报警的设置,以实现最佳的性能和稳定性。 总结来说,"淘宝好舒服"(Taobao-HSF)是一个为企业级服务架构设计的高性能...