Jakarta ee 我的web应用程序只能使用META-INF,而不能使用包含beans.xml的web-INF。为什么?

Jakarta ee 我的web应用程序只能使用META-INF,而不能使用包含beans.xml的web-INF。为什么?,jakarta-ee,cdi,wildfly-8,meta-inf,Jakarta Ee,Cdi,Wildfly 8,Meta Inf,我正在用java编写依赖注入的示例,大多数文档都强调了我必须在其中放入一个空的beans.xml META-INF(如果是jar应用程序) WEB-INF(如果是WEB应用程序) 所以,我使用war类型的打包,但是,我的应用程序只有在我将beans.xml放入META-INF文件夹时才能工作。我有点困惑,为什么它会以这种方式工作?我将war文件部署在JBOSS/WildFly容器中 这是我的简单答案 beans.xml位于src/main/resources/META-INF 在这里,您还可

我正在用java编写依赖注入的示例,大多数文档都强调了我必须在其中放入一个空的
beans.xml

  • META-INF(如果是jar应用程序)
  • WEB-INF(如果是WEB应用程序)
所以,我使用war类型的打包,但是,我的应用程序只有在我将
beans.xml
放入META-INF文件夹时才能工作。我有点困惑,为什么它会以这种方式工作?我将war文件部署在JBOSS/WildFly容器中

这是我的简单答案

beans.xml位于
src/main/resources/META-INF

在这里,您还可以看到我只用于注入bean的注释

AutoService.java

BMWAutoService.java

AutoServiceCaller.java


这取决于使用注释的位置。如果您的web模块中有EJB bean,并且正在这些bean中使用注入,那么您将需要在
META-INF
中有
beans.xml
,就像在纯EJB模块中一样。如果您在web组件(servlet、过滤器、JSFbean)中使用CDI注入,那么您必须在
web-INF
中使用它。您可能在两个位置都需要它们(如果从两种组件中使用)。

谢谢您的回答。我只使用了
@Named
@Inject
注释来注入bean。那么,这是否意味着我正在使用EJB bean?我添加了非常简单的代码示例Iused@quartaela不,看起来您只使用WebBean。因此,打包后,beans.xml应该位于
WEB-INF
中。尝试将beans.xml放入
src\main\webapp\WEB-INF
文件夹,而不是
src/main/resources/META-INF
。这样就行了!您能告诉我
src\main\webapp
src\main\resources
之间的区别吗?我试图将
WEB-INF
放在参考资料文件夹中,就像我对
META-INF
@quartaela所做的一样,这就是工作原理。
resources
文件夹是resources:)的根文件夹,放置在那里的文件被复制到compiled classes文件夹中,因此
WEB-INF/classes
对于war打包和
beans.xml
来说,它的位置不正确。另一方面,
webapp
是web应用程序文件的根目录,如HTML、JSP、图像等,还用于存储
web-INF
子文件夹(如web.xml)中的任何描述符以及打包后应放在
web-INF
中的其他配置文件。
public interface AutoService {
    void getService();
}
@Named("bmwAutoService")
public class BMWAutoService implements AutoService{

    @Override
    public void getService() {
        System.out.println("You chose BMW auto service");
    }
}
@Named
public class AutoServiceCallerImp implements AutoServiceCaller{

    private AutoService bmwAutoService;

    @Inject
    public AutoServiceCallerImp(@Named("bmwAutoService") AutoService bmwAutoService) {

        this.bmwAutoService = bmwAutoService;
    }

    @Override
    public void callAutoService() {
        // get bmw's auto service
        bmwAutoService.getService();
    }
}