无法在Tomcat中使用HK2部署Jersey

问题描述 投票:0回答:1

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

所以我考虑尝试使用Tomcat,因为我认为这是HK2和CDI如何相互冲突的问题,但它也不能在Tomcat上运行,我在部署war文件时遇到此错误:

严重[RMI TCP连接(2)-127.0.0.1] org.apache.catalina.startup.ContextConfig.beforeStart异常修复docBase for context [/ 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的org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:395)org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:149)。 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)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java位于com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke的org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)中的.lang.reflect.Method.invoke(Method.java:498)(DefaultMBeanServerInterceptor) .java:819)位于org.apache.catalina的org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:482)的com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)。 sun.reflect.NativeMethodAccessorImpl.invoke0上的mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:431)(本机方法) )在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)atg的java.lang.reflect.Method.invoke(Method.java:498) .apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke (jmxMBeanServer.java:801)位于javax的javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)的com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:468)。 manage.remote.rmi.RMIConnectionImpl.access $ 300(RMIConnectionImpl.java:76)at javax.management.remote.rmi.RMIConnectionImpl $ PrivilegedOperation.run(RMIConnectionImpl.java:1309)at java.security.AccessController.doPrivileged(Native Method)在javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(R MIConnectionImpl.java:1408)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java)中的javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) 62)at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498) )at sun.rmi.transport.Transport $ 1.run(Transport.java:200)at sun.rmi.transport.Transport $ 1.run(Transport.java:197)at java.security.AccessController.doPrivileged(Native Method)at at sun.rmi.transport.Transport.serviceCall(Transport.java:196)at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0( TCPTransport.java:834)at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.lambda $ run $ 0(TCPTransport.java:688)at java.security.AccessController.doPrivi在java.util.concurrent的java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)的sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run(TCPTransport.java:687)中的leged(Native Method)。 ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)

这是我对DI的AbstractBinder实现:

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")

但它也没有用。

tomcat dependency-injection jersey jersey-2.0 hk2
1个回答
0
投票

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

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

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

  1. 更改webapp文件夹权限以允许来自用户的写入。
  2. 在Tomcat安装中更改webapp中的默认server.xml文件夹位置。
© www.soinside.com 2019 - 2024. All rights reserved.