J2EE CDI beans部署在独立的jar包中

本篇博客主要介绍,CDI开发中,将所有的CDI Bean打包到一个jar包中,如何解决org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [...] with qualifiers [@...] at injection point ... 异常。

介绍

在CDI项目中beans.xml的一个主要作用就是告诉容器我们所开发的CDI存在的位置,保证容器能够扫描到这些类文件。这篇博客主要介绍在一个独立的jar文件中如何配置才能够保证在web应用中的这些CDI Bean能够被加载进来。

开发环境

1.  Ubuntu 12.04

2  JDK 1.7.0.2.1

3  Weld 1.1.10

4 Tomcat 7.0.35

CDI JAR文件

在上一篇博客中我们已经知道开发一个CDI web应用程序需要将beans.xml文件放到WEB-INF文件夹下以保证web容器能够扫描并加载这些CDI bean 类文件。而通常项目开发过程中我们会将这些CDI Beans打包到一个JAR文件中,放到web项目的WEB-INF/lib文件夹下使用,这样的话我们必须得保证容器知道这些CDI beans并去扫描跟加载这些类。解决这个问题的办法就是将beans.xml文件放到JAR文件下的META-INF文件夹下。

应用测试

我们使用一个比较简单的web应用来测试这个方案。首先应用程序是一个多模块的maven项目,在web模块的war包中包含一个CDi模块。如果你不知道如何构建一个多模块的web应用程序,请参考How
to create a multiple module project using Maven
.

应用结构

正如我们看到的,我们在META-INF文件夹下创建了一个beans.xml文件。当我们构建web模块时被引用的CDI模块会被引用到WEB-INF、lib文件目录下。由于CDI模块的jar包包含了beans.xml文件,容器就会知道去哪扫描这些CDI文件。

CDI Service接口和它的实现类都包含在项目的lib目录下,这样实现类就可以注入到web应用模块中TestServlet的Servlet中。

错误配置结果

如果我们没有将包含CDI
beans的jar包正确的部署到相应的地方,在CDI初始化的时候找不到相应的依赖关系就会抛出初始化异常信息。如容器找不到任何的依赖注入的依赖关系就会抛出以下异常信息

org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [Service] with qualifiers [@Default] at injection point ...

本文涉及到的源代码下载java-ee-cdi-beans-deployed-in-external-library-web-inf-lib-jar-file.zip

时间: 2024-11-12 09:05:47

J2EE CDI beans部署在独立的jar包中的相关文章

换了应用部署环境,读取jar包中文件遇到的问题。

程序换了个tomcat部署出现了问题,在原来的系统里好好的.最后定位问题发现是使用dom4j读取jar包中文件出现的问题,dom4j的异常是:org.dom4j.DocumentException: null Nested exception: null,经过观察发现拿到的InputStream对象为空.再追代码发现是因为JarFile压根就没有读到文件.顺手换成了当前线程上下文去读取文件,这次抛出的异常很清楚,jar文件找不到.最近经过观察发现是引文文件路径中存在空格,这是和原来系统不同的地方

spring加载jar包中的多个配置文件[转载]

在使用spring加载jar包中的配置文件时,不支持通配符,需要一个一个引入,如下所示: Java代码 <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:beanconfigs/applicationContext_1.xml, classpath*:beanconfigs/applicationContext_2.xml, ...

[Java基础] 深入jar包:从jar包中读取资源文件

转载: http://hxraid.iteye.com/blog/483115?page=3#comments 我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看下面的代码: //源代码1: package edu.hxraid; import java.io.*; public class Resource { public void getRe

读取Jar包中的资源问题探究

最近在写一个可执行jar的程序,程序中包含了2个资源包,一个是images,一个是files.问题来了,在Eclipse里开发的时候,当用File类来获取files下面的文件时,没有任何问题.但是当程序导出为Runnable Jar时,运行程序时抛出异常,File not found.我们来一探究竟. 首先是我的工程目录结构: 程序中访问images下的图片代码: [java] view plaincopyprint? setIconImage(new ImageIcon(this.getCla

JAR包中的MANIFEST.MF文件详解以及编写规范

参考百度百科的解释如下: MANIFEST.MF:这个 manifest 文件定义了与扩展和包相关的数据.单词“manifest”的意思是“显示” 打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录,这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了该Jar文件的很多信息,下面将详细介绍MANIFEST.MF文件的内容,先来看struts.jar中包含的MANIFEST.MF文件内容: Manifest-Version: 1.0 Created-

java 从jar包中读取资源文件

在代码中读取一些资源文件(比如图片,音乐,文本等等),在集成环境(Eclipse)中运行的时候没有问题.但当打包成一个可执行的jar包(将资源文件一并打包)以后,这些资源文件找不到,如下代码:Java代码 [java] view plaincopy //源代码1: package edu.hxraid; import java.io.*; public class Resource { public  void getResource() throws IOException{ File fil

spring加载jar包中多个配置文件(转)

转自:http://evan0625.iteye.com/blog/1598366 在使用spring加载jar包中的配置文件时,不支持通配符,需要一个一个引入,如下所示: Java代码 <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:beanconfigs/applicationContext_1.xml, classpath*:

27 Java动态加载第三方jar包中的类

我加载的方法是://参数fileName是jar包的路径,processorName 是业务类的包名+类名public static A load(String fileName, String processorName) {            String filePath = fileName;              A processor = null;  URL url;try {  url = new URL(filePath);} catch (MalformedURLEx

有关打包成可执行jar包后引用jar包中配置文件问题

一 问题由来 有时候我们做一些项目时,需要将一些配置信息写入配置文件中,以供调用.比如说这样: 如果我们需要在Demo.java中读取config.txt这个文件中的配置信息,在这种工程目录下是可以使用File来读取的,但是打包成jar后,使用File将不能读取到config.txt了,除非将这个配置信息放在jar包的外面. 假如说我们用File来读取文件: BufferedReader reader = new BufferedReader(new FileReader(new File("r