Java Springboot独立JAR应用程序的JNDI配置
我用Springboot创建了一个JAR应用程序。 我在Tomcat服务器下启动这个JAR应用程序 有人要求我使用JNDI检索存储在Tomcat context.xml中的数据源,说这很容易 我尝试用下面的代码来实现这一点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.
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。 谢谢凯达
- 在Tomcat服务器上读取context.xml文件
- 从这个context.xml文件中提取包含与数据库有关的所有属性的xml元素
- 从此数据库属性构造数据源对象
- 凯达尔给了我一个答案。
我总结了凯达尔的回答:
@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元素
- 从此数据库属性构造数据源对象
@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,我想把你的答案标记为“答案”,但我不能,因为你写的是评论。但是你写的东西回答了我的问题。我必须朝这个方向看。你给我指个好方向。谢谢凯达。