【发布时间】:2023-03-31 15:37:01
【问题描述】:
我有一个 Java 网络应用程序,它使用一些外部程序(调用命令行工具)。
我想让命令行程序的路径是可配置的,这样我就可以在不重新构建我的应用程序的情况下更改它。
问题:
1) 我应该使用哪个参数(web.xml 中可用的参数),如果它只设置一次(在部署时)并且此后永远不会改变?
2) 如何在我的 Java 代码中访问此参数?
提前致谢
德米特里
【问题讨论】:
标签: java jakarta-ee
我有一个 Java 网络应用程序,它使用一些外部程序(调用命令行工具)。
我想让命令行程序的路径是可配置的,这样我就可以在不重新构建我的应用程序的情况下更改它。
问题:
1) 我应该使用哪个参数(web.xml 中可用的参数),如果它只设置一次(在部署时)并且此后永远不会改变?
2) 如何在我的 Java 代码中访问此参数?
提前致谢
德米特里
【问题讨论】:
标签: java jakarta-ee
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app>
<context-param>
<param-name>command</param-name>
<param-value>SOME_COMMAND</param-value>
</context-param>
.
.
.
.
</web-app>
Java 代码
String commandToExecute = getServletContext().getInitParameter("command");
或者
你也可以把这个东西放在类路径中的property/xml文件中读取它并在上下文初始化时把它放到servlet上下文中。
【讨论】:
您可以使用 env-entry:
<env-entry>
<description>command line</descriptor>
<env-entry-name>commandLine</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>some_command</env-entry-value>
</env-entry>
并从您的 webapp 代码中的任何位置获取它:
javax.naming.Context ctx = new javax.naming.InitialContext();
String command = (String) ctx.lookup("java:comp/env/commandLine");
【讨论】:
在这种情况下,我会使用系统属性。只需使用-Dyour.command.path=/path/to/your/command 之类的 JVM 标志运行您的应用程序服务器,然后在代码中,您只需编写:
String cmd = System.getProperty("your.command.path", "/some/default/fallback/path/cmd");
这样你就不会依赖在一些 Java EE / servlet 容器中运行。
【讨论】:
这是一个两部分的解决方案。
Apache CLI 是进行一些编程访问的一个很好的替代方案。
【讨论】: