`
mozhenghua
  • 浏览: 324612 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

解決HSF在JETTY中不能正常使用的问题

 
阅读更多

写了一个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有啥不同:

  1. main函数中的classloader是 sun.misc.Launcher$AppClassLoader@19821f
  2. 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。

分享到:
评论
2 楼 hongliangpan 2013-06-27  
今天也遇到类似的问题
一、
背景:
一个main方法启动一个java app和一个jetty webserver
但是jetty webserver 获取不到java app的数据。【就是jetty web action不能获取 app中对象的返回结果】
原因:两部分程序有两个classLoader
sun.misc.Launcher$AppClassLoader@558fe7c3
jetty WebappClassLoader

解决方案:都用sun的AppClassLoader
把jetty的loader设为sun的AppClassLoader:
  ClassLoader t_classLoader = Thread.currentThread().getContextClassLoader();
WebAppContext.setClassLoader();

二、
然后访问web应用,出现jstl错误:
http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application

解决方案:
1.只用jstl-1.2.jar  ,不需要standard.jar
2.同时调整classLoader
URLClassLoader t_newClassLoader = new URLClassLoader(new URL[] { t_urlTaglibs }, classLoader);
        Thread. currentThread().setContextClassLoader(t_newClassLoader);
jettyServer.start();
1 楼 magic4u 2012-05-11  
兄弟, taobao的HSF是不是没有开源啊?

相关推荐

    Jetty 核心架构

    - **HSF_Jetty插件**:该插件解决了开发过程中频繁重启服务器的问题,通过将Jetty集成到IDE中,可以实现实时热更新。 - **问题与解决方案**: - **依赖类**:在开发过程中,依赖的类可能需要动态加载。通过IDE提供...

    taobao-hsf.sar

    总的来说,"taobao-hsf.sar"文件是HSF服务的载体,它的部署意味着HSF服务可以在Tomcat环境中运行,提供高效、稳定的分布式服务。对于开发者来说,理解和掌握HSF框架有助于构建可扩展、高可用的分布式系统,提升整体...

    taobao-HSF的两种安装方案

    标题中的“taobao-HSF”指的是淘宝的High Speed Service(HSF)框架,它是一个高性能、高可用的服务治理框架,主要用于阿里巴巴集团内部的分布式服务调用。HSF提供了包括服务发现、服务调用、负载均衡、熔断保护等一...

    HSF项目例子IDEA 与 eclipse 开发环境说明

    3. **配置HSF依赖**:在`pom.xml`文件中添加HSF相关的依赖库,如HSF服务提供者和消费者的相关依赖。 4. **运行与调试**:通过IDEA的Run/Debug配置,可以方便地启动HSF服务提供者和消费者,进行本地测试和调试。 ###...

    阿里hsf接口 sar包

    - **监控与日志**:启用HSF的日志和监控功能,以便于定位和解决问题。 - **服务测试**:在发布服务前,进行充分的单元测试和集成测试,确保服务的正确性。 总的来说,HSF接口的`.sar`包是HSF服务的重要组成部分,它...

    taobao-hsf.tgz

    理解和掌握HSF的使用方法,对于构建和维护大规模分布式系统至关重要,尤其是在阿里巴巴这样的电商环境中,HSF起到了关键的角色。通过深入学习和实践,你可以更好地驾驭这个强大的服务框架,提升系统的稳定性和效率。

    淘宝HSF使用说明

    淘宝的HSF框架,用户手册,有兴趣的人欢迎下载~内部文档哦~

    HSF and 编码规范

    编码规范是软件开发中的重要环节,对于HSF项目而言,遵循良好的编码规范能确保代码的可读性、可维护性和团队协作效率。编码规范通常包括命名规则、注释规范、代码结构、异常处理、类型转换、空指针检查等多个方面。...

    EDAS-HSF-BOOT

    在"EDAS-HSF-BOOT"项目中,我们可以看到"pandora-hsf-boot-demo"这个文件,这通常是一个示例项目,用于展示如何使用HSF-BOOT来创建和消费HSF服务。Pandora是阿里巴巴开源的分布式系统治理平台,它集成了HSF,可以...

    Springboot+HSF分布式服务框架+EDAS注册中心,实现发布订阅模式

    1. **服务提供者**:首先,你需要在Spring Boot应用中定义HSF服务,通过HSF的API来暴露服务接口。这通常涉及编写服务接口类和服务实现类,然后使用HSF的注解或配置来标记为服务提供者。 2. **服务注册**:在HSF服务...

    hsfjetty插件,eclipse用

    在Eclipse中使用HSFJetty插件,可以显著提升Java开发者在HSF和Jetty项目中的工作效率,简化开发流程,减少错误,并促进更好的代码质量和可维护性。对于那些需要处理HSF服务和Jetty应用的开发者来说,这是一个...

    阿里云HSF用户指导手册

    自己公司用的HSF架构培训手册,当时还有阿里的人来培训我们,希望帮助到需要用的HSF技术的人

    HSF用户手册

    - **目标**: HSF的主要目标是解决分布式应用中的通信问题,包括但不限于远程调用、服务发现与注册、负载均衡、故障恢复等。 - **特性**: - **高性能**: 通过高效的序列化协议和支持高并发处理能力实现。 - **轻量...

    HSF实现原理讲解

    HSF 框架的原理讲解,主要包含了知识点:rpc,动态代理,HSF可以作为微服务的基础框架进行二次开发

    taobao-hsf

    在使用过程中,开发者需要将 "taobao-hsf" 包解压到阿里云定制的Tomcat容器——"Ali-Tomcat" 的部署目录"D:\work\tomcat\deploy" 下。这样做是为了让HSF服务能够在EDAS的容器中顺利运行,实现服务的发布和调用。 ...

    HSF文件资料管理程序.doc

    这个程序的主要目的是确保在电气和电子设备行业中,按照RoHS(限制在电气和电子设备中使用某些有害物质指令)和其他相关法规的要求,正确制定、应用、存储和保护文件,以便随时获取正确有效的信息。 RoHS指令是一项...

    阿里云HSF用户开发指导手册

    2. **轻量级**:HSF不需要额外的中间件支持,可以直接在Java应用服务器上运行,降低了系统的复杂度。 3. **服务治理**:包括服务注册、发现、路由、负载均衡等,保证服务的稳定性和高可用性。 4. **容错机制**:HSF...

    淘宝好舒服 taobao-hsf

    在实际应用中,使用HSF需要注意服务粒度的划分、接口设计的合理性、服务版本管理的策略以及监控报警的设置,以实现最佳的性能和稳定性。 总结来说,"淘宝好舒服"(Taobao-HSF)是一个为企业级服务架构设计的高性能...

Global site tag (gtag.js) - Google Analytics