使用属性管理器和tomcat配置jar以从文件读取属性

时间:2013-07-12 13:14:19

标签: java spring spring-mvc properties tomcat7

首先,如果这个问题标题错误,我道歉。

目标:我正在使用maven来打包需要读取外部属性文件的jar。 jar将由将使用tomcat7部署的战争使用。在tomcat中,setenv.sh如下所示,属性文件(PROPERTY_MANAGER)的位置是从jar将读取属性的位置设置的。我该怎么做?

我正在使用Apache-tomcat-7.0.32而我的 setenv.sh 读取:

export JAVA_OPTS="-DPROPERTY_MANAGER=$CATALINA_HOME/myPropertiesDir -DCOMMON_PROPERTIES=$CATALINA_HOME/myCommonPropsDir -DAPP_ENCRYPTION_PASSWORD=pass $JAVA_OPTS"

在eclipse中我导入一个现有的maven模块。我的模块在这一点上是一个简单的java类(所以我可以测试如何通过tomcat读取属性)。这是我的班级:

Class MyClass{
 private String var1;
 private String var2;
 public MyClass(){}
 public String getVar1() { return var1; }
 public String getVar2() { return var2; }
 public String setVar1(String a) { var1 = a; }
 public String setVar2(String a) { var2 = b; }
 public static void main (String []arg){
   MyClass c = new MyClass();
   System.out.println(“var1 = “ + c.getVar1() +”, var2 = “+c.getVar2());
 }
}// end of class

以下是src / main / resources

下的 myprops.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=http://www.springframework.org/schema/beans 
       xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance    
       xmlns:si=http://www.springframework.org/schema/integration 
       xmlns:jms=http://www.springframework.org/schema/integration/jms
       xmlns:context=http://www.springframework.org/schema/context
       xmlns:util=http://www.springframework.org/schema/util
       xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
               http://www.springframework.org/schema/context              
               http://www.springframework.org/schema/context/spring-context-3.1.xsd
               http://www.springframework.org/schema/util  
               http://www.springframework.org/schema/util/spring-util-3.1.xsd">                     

      <context:property-placeholder location="file:${PROPERTY_MANAGER}/myclass-props.properties" ignore-unresolvable="true"/> 
      <!-- MyClass bean -->
      <bean id="mybean" class="my.com.test.MyClass">
        <property name="var1" value="${prop.var1}" />
        <property name="var2" value="${prop.var2}" />
     </bean>
 </beans>

myclass-props 位于$ CATALINA_HOME / myCommonPropsDir下,如下所示:

prop.var1=abc
prop.var2=123

上面的类是作为maven模块构建的,并打包为jar。为了测试这个,我启动了tomcat,然后在Eclipse中尝试将主类作为Java Application运行并将其作为远程Java应用程序进行调试。遥远的人什么都不做。在Java应用程序中运行它给我以下输出:      var1 = null,var2 = null;

显然,没有拾取属性文件。我在这做错了什么?我确信它有点小我不见了。感谢您提前提出的所有建议。

2 个答案:

答案 0 :(得分:0)

我猜你的问题是${PROPERTY_MANAGER}没有被sysprop取代(maven sysprop替换与spring完全不同)。如果您的目标是使jar读取外部属性文件而不对位置进行硬编码,请改为使用classpath:

<context:property-placeholder location="classpath:/myclass-props.properties" ignore-unresolvable="true"/>

然后您可以将文件放在$ TOMCAT_HOME / lib或包含在类路径中的任何其他文件夹

答案 1 :(得分:0)

Santosh是对的。没有什么可以提升你的春天背景。

当您从Eclipse运行它作为Java应用程序时,只需执行main方法代码。在main方法中,您创建了MyClass的实例 - 这不是您创建spring bean的方式。 Spring不会为使用new关键字创建的类注入属性或bean引用。此外,Eclipse在运行时不会在Tomcat上部署jar。

尝试使用包含bean的spring上下文创建一个Web应用程序,该bean将使用您的属性读取模块(如您在问题中所述),然后测试它是否有效。不要使用new关键字来创建MyClass的实例,而是注入在上下文中声明的bean。您可以在main方法中创建上下文,但不会在应用程序服务器上运行。

我建议稍微阅读Spring Framework's documentation(特别是关于bean实例化和依赖注入的部分)。