Java Springboot独立JAR应用程序的JNDI配置

Java Springboot独立JAR应用程序的JNDI配置,java,spring-boot,jndi,Java,Spring Boot,Jndi,我用Springboot创建了一个JAR应用程序。 我在Tomcat服务器下启动这个JAR应用程序 有人要求我使用JNDI检索存储在Tomcat context.xml中的数据源,说这很容易 我尝试用下面的代码来实现这一点 Context initContext; try { initContext = new InitialContext(); Context envContext = (Context) initContext.

我用Springboot创建了一个JAR应用程序。 我在Tomcat服务器下启动这个JAR应用程序

有人要求我使用JNDI检索存储在Tomcat context.xml中的数据源,说这很容易

我尝试用下面的代码来实现这一点

Context initContext;
        try {
            initContext = new InitialContext();
            Context envContext = (Context) initContext.lookup("java:comp/env");
            DataSource ds = (DataSource) envContext.lookup("jdbc/mydatabase");
        } catch (NamingException e) {
            System.out.println("ERROR!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
            e.printStackTrace();
            System.out.println("ERROR!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        }
但它不起作用

我得到这个错误:

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
这是克服这个问题的简单方法吗

或者,对于我的JAR独立应用程序,它仍然绝对不可能克服这个问题,就像前面的帖子所说的那样

我看到很多帖子,很多文档,但对我来说还不清楚

谢谢你的帮助,谢谢你的分享

托马斯·凯达尔给了我一个答案。 我总结了凯达尔的回答:

  • 当使用JAR命令行运行JAR应用程序时,我使用的是嵌入式Tomcat
  • 当我使用嵌入式Tomcat时,我可能无法访问我的JNDI数据源 这就是我的JNDI不能工作的原因。 我将尝试查看这篇文章来配置我的应用程序,以便尝试使用JNDI: 但是,现在,多亏了Kedar,我明白了为什么我的JNDI代码不能工作。 如果可能的话,我将在另一篇文章中看到如何配置使用JNDI。 谢谢凯达
    • 凯达尔给了我一个答案。 我总结了凯达尔的回答:

      • 当使用JAR命令行运行JAR应用程序时,我使用的是嵌入式Tomcat
      • 当我使用嵌入式Tomcat时,我可能无法访问我的JNDI数据源 这就是我的JNDI不能工作的原因。 我将尝试查看这篇文章来配置我的应用程序,以便尝试使用JNDI: 但是,现在,多亏了Kedar,我明白了为什么我的JNDI代码不能工作。 如果可能的话,我将在另一篇文章中看到如何配置使用JNDI。 谢谢凯达

      很抱歉延迟给出答案

      感谢Kedar指出JNDI不能使用JAR,我尝试:

      • 在Tomcat服务器上读取context.xml文件
      • 从这个context.xml文件中提取包含与数据库有关的所有属性的xml元素
      • 从此数据库属性构造数据源对象
      还感谢MKyong提供本教程:

      以下是我在SpringBoot下的工作代码:

      @Configuration
      public class ApplicationConfiguration {
      
      /**
       * Absolute path of the configuration file named context.xml on any Tomcat Server (DEV, TEST, PROD).
       */
      private final String CONTEXT_XML_PATH_ON_SERVER = "/opt/tomcat/apache-tomcat-version/conf/context.xml";
      
      @Bean
      @Primary
      public DataSource dataSource() {
          try {
              Element datasourceElement = getDatasourceElementInTomcatContextXml();
              return DataSourceBuilder
                      .create()
                      .username(datasourceElement.getAttribute("username"))
                      .password(datasourceElement.getAttribute("password"))
                      .url(datasourceElement.getAttribute("url"))
                      .driverClassName(datasourceElement.getAttribute("driverClassName"))
                      .build();
          } catch (ParserConfigurationException e) {
              e.printStackTrace();
          } catch (SAXException | IOException e) {
              e.printStackTrace();
          }
          return null;
      }
      
      private Element getDatasourceElementInTomcatContextXml() throws ParserConfigurationException, SAXException, IOException {
          File contextXmlFile = new File(CONTEXT_XML_PATH_ON_SERVER);
          DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
          DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
          Document doc = dBuilder.parse(contextXmlFile);
          //optional, but recommended
          //read this - http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
          doc.getDocumentElement().normalize();
          NodeList resourceElementList = doc.getElementsByTagName("Resource");
          Node nNode = resourceElementList.item(0);
          Element eElement = (Element) nNode;
          return eElement;
      }
      
      }

      谢谢Kedar和MKyong


      托马斯

      很抱歉耽搁了回答

      感谢Kedar指出JNDI不能使用JAR,我尝试:

      • 在Tomcat服务器上读取context.xml文件
      • 从这个context.xml文件中提取包含与数据库有关的所有属性的xml元素
      • 从此数据库属性构造数据源对象
      还感谢MKyong提供本教程:

      以下是我在SpringBoot下的工作代码:

      @Configuration
      public class ApplicationConfiguration {
      
      /**
       * Absolute path of the configuration file named context.xml on any Tomcat Server (DEV, TEST, PROD).
       */
      private final String CONTEXT_XML_PATH_ON_SERVER = "/opt/tomcat/apache-tomcat-version/conf/context.xml";
      
      @Bean
      @Primary
      public DataSource dataSource() {
          try {
              Element datasourceElement = getDatasourceElementInTomcatContextXml();
              return DataSourceBuilder
                      .create()
                      .username(datasourceElement.getAttribute("username"))
                      .password(datasourceElement.getAttribute("password"))
                      .url(datasourceElement.getAttribute("url"))
                      .driverClassName(datasourceElement.getAttribute("driverClassName"))
                      .build();
          } catch (ParserConfigurationException e) {
              e.printStackTrace();
          } catch (SAXException | IOException e) {
              e.printStackTrace();
          }
          return null;
      }
      
      private Element getDatasourceElementInTomcatContextXml() throws ParserConfigurationException, SAXException, IOException {
          File contextXmlFile = new File(CONTEXT_XML_PATH_ON_SERVER);
          DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
          DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
          Document doc = dBuilder.parse(contextXmlFile);
          //optional, but recommended
          //read this - http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
          doc.getDocumentElement().normalize();
          NodeList resourceElementList = doc.getElementsByTagName("Resource");
          Node nNode = resourceElementList.item(0);
          Element eElement = (Element) nNode;
          return eElement;
      }
      
      }

      谢谢Kedar和MKyong


      托马斯

      你在使用嵌入式Tomcat吗?非常感谢Kedar。非常感谢Kedar。我没有使用嵌入式Tomcat。我制作了一个“mvn clean package”来创建我的JAR,然后我必须通过MobaXTerm将JAR放在现有的Tomcat服务器上(在现有服务器上的任何位置),最后我通过命令“JAR-JAR-myJar”在现有的Tomcat服务器上运行JAR。如果您使用的是
      java-JAR-myJar
      ,那么您使用的是嵌入式Tomcat。在这种情况下,您可能没有JNDI数据源。非常感谢Kedar。你的分析对我帮助很大。我已经将这篇文章加入书签,我希望它能将这篇文章标记为已回复。只是一个小问题:如果你知道一个很好的文档来解释所有这些事实,我很感兴趣。非常感谢您,祝您度过愉快的一天和一周。您正在使用嵌入式Tomcat吗?非常感谢Kedar。非常感谢Kedar。我没有使用嵌入式Tomcat。我制作了一个“mvn clean package”来创建我的JAR,然后我必须通过MobaXTerm将JAR放在现有的Tomcat服务器上(在现有服务器上的任何位置),最后我通过命令“JAR-JAR-myJar”在现有的Tomcat服务器上运行JAR。如果您使用的是
      java-JAR-myJar
      ,那么您使用的是嵌入式Tomcat。在这种情况下,您可能没有JNDI数据源。非常感谢Kedar。你的分析对我帮助很大。我已经将这篇文章加入书签,我希望它能将这篇文章标记为已回复。只是一个小问题:如果你知道一个很好的文档来解释所有这些事实,我很感兴趣。非常感谢你,祝你度过愉快的一天和一周。凯达,我想把你的答案贴上“答案”的标签,但我不能,因为你写的是评论。但是你写的东西回答了我的问题。我必须朝这个方向看。你给我指个好方向。谢谢Kedar。Kedar,我想把你的答案标记为“答案”,但我不能,因为你写的是评论。但是你写的东西回答了我的问题。我必须朝这个方向看。你给我指个好方向。谢谢凯达。