在Eclipse中为Tomcat提供每个上下文的JNDI变量

Gar*_*son 5 eclipse tomcat jndi

我在Eclipse 4.6.1中使用Tomcat 8.5.6.我有我的web-app项目/上下文foo,它有一个JAX-RS(使用RESTEasy 3.1.0.CR3)端点bar,所以我可以在Eclipse中启动Tomcat并访问:

http://localhost:8080/foo/bar
Run Code Online (Sandbox Code Playgroud)

我有一个名为的变量foobar,我希望使用JNDI在我的JAX-RS实现中访问:

final String foobar = (String) new InitialContext().lookup("java:comp/env/foobar");
Run Code Online (Sandbox Code Playgroud)

我计划使用Tomcat自动部署在生产中部署生成的WAR.我想foobar在WAR外部为Tomcat 配置变量.我怎么能这样做,以便我可以在Eclipse中测试它?

经过大量阅读,我发现了我认为$CATALINA_HOME的Eclipse : …\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\. 所以我创建了一个上下文文件foo,…\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\conf\Catalina\localhost\foo.xml用于对应我的项目/上下文,并在其中放入以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Environment name="foobar" type="java.lang.String" value="123"/>
</Context>
Run Code Online (Sandbox Code Playgroud)

是的,我知道每当我重建时Eclipse都会擦除这个目录.但是在构建之后,我保存到文件至少想看看它是否有效.它没有.我收到一个错误:

javax.naming.NameNotFoundException: Name [foobar] is not bound in this Context. Unable to find [foobar].
Run Code Online (Sandbox Code Playgroud)

我想至少让它工作,所以我可以知道如何在生产中执行此操作,并稍后担心Eclipse中的上下文文件删除事项.那我做错了什么?为什么Eclipse中的Tomcat不能找到这个JNDI变量?

注意:我没有使用web.xml文件而且不想这样做; 此外,此变量应在生产部署中的WAR 外部定义.

更新:好消息是(在Windows 10 Professional Anniversary Edition 64位上)使用相同的Tomcat但在独立模式下,我将相同的foobar.xml文件放在独立的Tomcat中conf\Catalina\localhost\foo.xml,而我的JAX-RS应用程序选择它就好了.那么如何在Eclipse中的Tomcat中定义JNDI变量进行测试呢?

Gar*_*son 3

看来,为了让 Eclipse+Tomcat 识别每个模块的上下文文件,您必须进入服务器配置(双击服务器)并打开“发布模块上下文”以分离 XML 文件。这样 Tomcat 将使用您创建的特定上下文 XML 文件。否则,它显然会将它们放入conf/server.xml并忽略您创建的特定于上下文的文件。

仍然存在这样的问题:每次重建时 Eclipse 都会重新生成该文件,从而破坏您放置在那里的任何 JNDI 变量。我正在尝试让/sf/answers/1566617391/中的解决方法起作用,但尚未成功。有人有更好的想法吗?

至少我现在能够重现生产环境——尽管是暂时的,直到下一次重建。