如何从随附的 Ear/lib/*.jar 访问 war/WEB-INF/classes?
how to acess war/WEB-INF/classes from enclosed Ear/lib/*.jar?
+app.ear
+lib
*.jar libraries that the war's use
+classes
*.properties and other configuration files
+META-INF
application.xml
jbos-app.xml
app.war
app2.war
appn.war
- 从封闭 EAR 的
lib/*.jar
调用 class 到 app.war 现在可以正常工作。
- 当我部署时,可以在 "War" 中看到两个单例实例化 classes(一个来自容器,另一个来自应用程序)。
我们可以从 lib/*.jar
访问 war/WEB-INF/classes
吗?
大多数情况下,它对 websockets 集成很有帮助,因为服务器端点位于 war 文件中。
我想获取 websockets 的会话并进行相应的处理。
选择 CDI 访问 WEB-INF/classes 或 WEB-INF/lib/*.jar 的原因:SPEC says about accessibility of classes
默认情况下,这设置为 false,这允许子部署看到 class属于 .ear.
中其他子部署的 es
例如,考虑以下 .ear 部署:
myapp.ear
|
|--- web.war
|
|--- ejb1.jar
|
|--- ejb2.jar
如果 ear-subdeployments-isolated 设置为 false,则 web.war 中的 classes 可以访问属于 ejb1.jar 和 ejb2.jar 的 classes。类似地,来自 ejb1.jar 的 classes 可以访问来自 ejb2.jar 的 classes(反之亦然)。
The ear-subdeployments-isolated element value has no effect on the isolated classloader of the .war file(s). i.e. irrespective of whether this flag is set to true or false, the .war within a .ear will have a isolated classloader and other sub-deployments within that .ear will not be able to access classes from that .war. This is as per spec.
编辑 2:
根据 Bruno 的博客通过 CDI 实现尝试了所有这些东西
https://blogs.oracle.com/brunoborges/entry/integrating_websockets_and_jms_with
在部署 Complete Ear 文件时遇到问题
下面class是触发事件到war/WEB-INF/classes/
import javax.ejb.Stateless;
import javax.enterprise.event.Event;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.inject.Inject;
import javax.inject.Named;
import javax.jms.Message;
import javax.websocket.Session;
import org.springframework.stereotype.Component;
@Component
@Stateless
@Named
public class WebsocketMessenger {
@Inject
@MessageEvent
private Event<Message> events;
public void sendMessageToWebsockets(String rawMessage, Session session){
RawMessageEvent rawMessageEvent = new RawMessageEvent(rawMessage, session);
// events.fire();
}
}
import javax.ejb.Stateless;
import javax.enterprise.event.Observes;
import javax.inject.Named;
@Stateless
@Named
public class RawMessageListener {
public void listenToTheRawMessage(@Observes @MessageEvent RawMessageEvent rawMessageEvent){
System.out.println("Received: " + rawMessageEvent);
}
}
下面是异常跟踪:
[org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor](MSC 服务线程 1-8)找到 JSR-330 'javax.inject.Inject' 注释并支持自动装配
2015-03-19 11:08:39,085 WARN [org.springframework.web.context.support.XmlWebApplicationContext](MSC 服务线程 1-8)上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.BeanCreationException:创建名称为 [ 的 bean 时出错=59=]:注入自动装配依赖失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:javax.enterprise.event.Event XXXX.HelloMessenger.events;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有找到类型为 [javax.enterprise.event.Event] 的符合条件的 bean 用于依赖项:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:{@javax.inject.Inject()}
原因:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:javax.enterprise.event.Event XXXX.HelloMessenger.events;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有找到类型为 [javax.enterprise.event.Event] 的符合条件的 bean 用于依赖项:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:{@javax.inject.Inject()}
在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:555)
在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
... 还有 22 个
摆脱了 CDI 事件处理,尝试了 war/WEB-INF/classes 的远程 ejb 通信。
它的工作! ,我可以和war文件后面的类通信
如果有人对 CDI 有答案,我们将不胜感激。
+app.ear
+lib
*.jar libraries that the war's use
+classes
*.properties and other configuration files
+META-INF
application.xml
jbos-app.xml
app.war
app2.war
appn.war
- 从封闭 EAR 的
lib/*.jar
调用 class 到 app.war 现在可以正常工作。 - 当我部署时,可以在 "War" 中看到两个单例实例化 classes(一个来自容器,另一个来自应用程序)。
我们可以从 lib/*.jar
访问 war/WEB-INF/classes
吗?
大多数情况下,它对 websockets 集成很有帮助,因为服务器端点位于 war 文件中。
我想获取 websockets 的会话并进行相应的处理。
选择 CDI 访问 WEB-INF/classes 或 WEB-INF/lib/*.jar 的原因:SPEC says about accessibility of classes
默认情况下,这设置为 false,这允许子部署看到 class属于 .ear.
中其他子部署的 es例如,考虑以下 .ear 部署:
myapp.ear | |--- web.war | |--- ejb1.jar | |--- ejb2.jar 如果 ear-subdeployments-isolated 设置为 false,则 web.war 中的 classes 可以访问属于 ejb1.jar 和 ejb2.jar 的 classes。类似地,来自 ejb1.jar 的 classes 可以访问来自 ejb2.jar 的 classes(反之亦然)。
The ear-subdeployments-isolated element value has no effect on the isolated classloader of the .war file(s). i.e. irrespective of whether this flag is set to true or false, the .war within a .ear will have a isolated classloader and other sub-deployments within that .ear will not be able to access classes from that .war. This is as per spec.
编辑 2:
根据 Bruno 的博客通过 CDI 实现尝试了所有这些东西
https://blogs.oracle.com/brunoborges/entry/integrating_websockets_and_jms_with
在部署 Complete Ear 文件时遇到问题
下面class是触发事件到war/WEB-INF/classes/
import javax.ejb.Stateless;
import javax.enterprise.event.Event;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.inject.Inject;
import javax.inject.Named;
import javax.jms.Message;
import javax.websocket.Session;
import org.springframework.stereotype.Component;
@Component
@Stateless
@Named
public class WebsocketMessenger {
@Inject
@MessageEvent
private Event<Message> events;
public void sendMessageToWebsockets(String rawMessage, Session session){
RawMessageEvent rawMessageEvent = new RawMessageEvent(rawMessage, session);
// events.fire();
}
}
import javax.ejb.Stateless;
import javax.enterprise.event.Observes;
import javax.inject.Named;
@Stateless
@Named
public class RawMessageListener {
public void listenToTheRawMessage(@Observes @MessageEvent RawMessageEvent rawMessageEvent){
System.out.println("Received: " + rawMessageEvent);
}
}
下面是异常跟踪:
[org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor](MSC 服务线程 1-8)找到 JSR-330 'javax.inject.Inject' 注释并支持自动装配 2015-03-19 11:08:39,085 WARN [org.springframework.web.context.support.XmlWebApplicationContext](MSC 服务线程 1-8)上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.BeanCreationException:创建名称为 [ 的 bean 时出错=59=]:注入自动装配依赖失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:javax.enterprise.event.Event XXXX.HelloMessenger.events;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有找到类型为 [javax.enterprise.event.Event] 的符合条件的 bean 用于依赖项:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:{@javax.inject.Inject()}
原因:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:javax.enterprise.event.Event XXXX.HelloMessenger.events;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有找到类型为 [javax.enterprise.event.Event] 的符合条件的 bean 用于依赖项:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:{@javax.inject.Inject()} 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:555) 在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ... 还有 22 个
摆脱了 CDI 事件处理,尝试了 war/WEB-INF/classes 的远程 ejb 通信。
它的工作! ,我可以和war文件后面的类通信
如果有人对 CDI 有答案,我们将不胜感激。