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

时间:2016-11-11 22:03:58

标签: eclipse tomcat jndi

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

http://localhost:8080/foo/bar

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

final String foobar = (String) new InitialContext().lookup("java:comp/env/foobar");

我计划使用Tomcat自动部署在生产中部署生成的WAR。我想在WAR外部为Tomcat配置foobar变量。我该怎么做才能在Eclipse中测试它?

经过大量阅读后,我发现了我认为是Eclipse的$CATALINA_HOME…\.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>

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

javax.naming.NameNotFoundException: Name [foobar] is not bound in this Context. Unable to find [foobar].

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

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

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

2 个答案:

答案 0 :(得分:3)

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

每次进行重建时,Eclipse仍然会重新生成此文件,从而破坏您放置的任何JNDI变量。我试图让https://stackoverflow.com/a/22380248/421049中的解决方法起作用,但还没有成功。谁有更好的想法?

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

答案 1 :(得分:0)

您在https://stackoverflow.com/a/22380248/1794485上找到Markus回答的链接让我能够正常工作,或者至少在他的解决方法中有所描述。但要解决的剩下问题是订购。

正如他所说,您可以通过在其他地方拥有META-INF/context.xml的本地副本,并将此文件夹添加到Eclipse项目的项目属性中的Deployment Assembly来解决此问题。

但最初这并不适合我。看起来,虽然属性中的Deployment Assembly显示为按名称排序,但事实上它具有与任何其他路径一样的顺序。然后,当我删除src/main/webapp条目(因此包含正常META-INF/context.xml的条目)并将其添加回来时,这有效地将其移动到了啄食顺序。 Eclipse中的下一个Tomcat部署和启动最终将我META-INF/context.xml的首选副本放在.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\myapp\META-INF

如果对Deployment Assembly路径的真实顺序有疑问,请查看文件系统上的Eclipse项目 - .settings\org.eclipse.wst.common.component