首页 > 解决方案 > 无法在 Tomcat 中使用 HK2 部署 Jersey

问题描述

我有一个工作的 Jersey JAX-RS 应用程序,我只是修改它以在一个构造函数中注入一个依赖项。我试图在 GlassFish 上部署它,但后来我在这里遇到了这个问题。

所以我考虑改用Tomcat,因为我认为这是HK2和CDI如何相互冲突的问题,但它在Tomcat上也不起作用,当我部署我的war文件时出现此错误:

严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.startup.ContextConfig.beforeStart 异常修复 docBase 的上下文 [/Gradle___com_myproject___webservice_1_0_0_SNAPSHOT_war] java.io.IOException: 无法创建目录 [C:\Program Files \Apache Software Foundation\Tomcat 8.5\webapps\Gradle___com_myproject___webservice_1_0_0_SNAPSHOT_war] 在 org.apache.catalina.startup.ExpandWar.expand(ExpandWar.java:115) 在 org.apache.catalina.startup.ContextConfig.fixDocBase(ContextConfig.java:615)在 org.apache.catalina.startup.ContextConfig.beforeStart(ContextConfig.java:748) 在 org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:301) 在 org.apache.catalina.util.LifecycleBase.fireLifecycleEvent (LifecycleBase.java:94) 在 org.apache.catalina.util.LifecycleBase。setStateInternal(LifecycleBase.java:395) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:149) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752) at org.apache .catalina.core.ContainerBase.addChild(ContainerBase.java:728) 在 org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734) 在 org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java :1736) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang。 reflect.Method.invoke(Method.java:498) 在 org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) 在 com。sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory. java:482) 在 org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:431) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java :300) 在 com.sun.jmx.interceptor.DefaultMBeanServerInterceptor。在 com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:468) 在 com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) 在 javax 调用(DefaultMBeanServerInterceptor.java:819) .management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468) 在 javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76) 在 javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation。在 javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1408) 在 javax.management.remote.rmi.RMIConnectionImpl 的 java.security.AccessController.doPrivileged(Native Method) 运行(RMIConnectionImpl.java:1309)。在 sun.reflect.NativeMethodAccessorImpl 调用(RMIConnectionImpl.java:829)。invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java: 498) 在 sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357) 在 sun.rmi.transport.Transport$1.run(Transport.java:200) 在 sun.rmi.transport.Transport$1.run(Transport .java:197) 在 java.security.AccessController.doPrivileged(Native Method) 在 sun.rmi.transport.Transport.serviceCall(Transport.java:196) 在 sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java :573) 在 sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834) 在 sun.rmi.transport.tcp.TCPTransport$ConnectionHandler。lambda$run$0(TCPTransport.java:688) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687) at java.util.concurrent .ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 java.lang.Thread.run(Thread.java:748)

这是我AbstractBinder对 DI 的实现:

public class UsersDependencyBinder extends AbstractBinder {    
    private static final Logger LOG = LoggerFactory.getLogger(UsersDependencyBinder.class);

    @Override
    protected void configure() {
        try {
            // Acts as a Singleton
            bind(new UsersDAO(new CachedDbConnector()));
        } catch (ClassNotFoundException e) {
            LOG.error("Error registering the DB Driver Manager", e);
        }
    }
}

这是我注入它的方法:

private final UsersDAO dao;

@Inject
public UserResource(UsersDAO dao) {
    this.dao = dao;
}

其余代码之前运行良好,只是一个ping,它什么都不做,我试图在编写代码之前让基础设施正常工作(服务器响应 API 调用,数据库启动并运行等)。

我试图添加:

implementation ("org.glassfish.jersey.bundles:jaxrs-ri:2.27")

但它也没有奏效。

标签: tomcatdependency-injectionjerseyjersey-2.0hk2

解决方案


答案实际上很简单,但没有很好的记录。

我在 Windows 上本地运行 Tomcat,使用 Windows 安装程序安装,它将位于Program File文件夹内,该文件夹具有普通用户的写保护,因此 IntelliJ IDEA 无法warwebapps文件夹中部署我的文件。

有两种方法可以解决这个问题:

  1. 更改webapp文件夹权限以允许用户写入。
  2. 更改Tomcat 安装中的默认webapp文件夹位置。server.xml

推荐阅读