首先,如果这个问题标题错误,我道歉。
目标:我正在使用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;
显然,没有拾取属性文件。我在这做错了什么?我确信它有点小我不见了。感谢您提前提出的所有建议。
答案 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实例化和依赖注入的部分)。