如何将我的资源放在多模块Web项目中的已部署WAR中

时间:2014-01-31 12:45:55

标签: java spring hibernate maven tomcat

好的,所以我有一个多模块的Web项目(Spring,Hibernate和所有这些),由WAR和3个JAR组成。其中2个JAR是核心WAR和JAR的可选扩展。扩展名由maven配置文件使用,它们将它们添加为依赖关系。一切正常。

然而,当在Tomcat服务器上安装项目时,我注意到我无法编辑扩展模块的属性文件,因为它们打包在JAR文件中。因此,当我使用maven打包我的项目时,我正在寻找一种方法将我的属性文件从我的扩展JAR移动到我的可部署WAR的资源文件夹。这意味着当激活扩展时,资源将仅位于WEB资源文件夹中。

我怎样才能做到最好?

修改-01

好的,所以我尝试使用qza建议的build-helper-maven-plugin。

试战POM:

<project>
...    
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.1.1</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.8</version>
            <executions>
                <execution>
                    <id>add-resource</id>
                    <phase>process-resources</phase>
                    <goals>
                        <goal>add-resource</goal>
                    </goals>
                    <configuration>
                        <resources>
                            <resource>
                                <directory>../extTestA-jar/src/main/resources</directory>
                                <targetPath>resources</targetPath>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
</project>

我的项目布局如下:

<Parent>
--><extTestA-jar>
--><extTestB-jar>
--><test-jar>
--><test-war>

我的资源位于“src / main / resources”

有人能发现这个问题吗?我已尝试使用和不使用targetPath但似乎没有工作。我也尝试在generate-resources阶段做到但仍然没有运气。我认为这条路可能是错的,所以我尝试了其他一些但仍然没有运气。

2 个答案:

答案 0 :(得分:1)

最好从项目外部读取属性。为应用程序服务器创建配置文件夹,并在服务器启动脚本中定义它,例如:

-Dconfiguration.dir=/etc/tomcatConf

然后将配置文件/文件夹放在该文件夹下,并使用spring属性占位符bean扫描它们:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>file:${configuration.dir}/module1/auth.properties</value>
        </list>
    </property>
</bean>

现在,当您更改属性时,您将只需要重新启动服务器,不需要重新创建war / jard。

请注意,您不需要具有系统参数。它用于为应用程序服务器保留标准配置目录。你可以使用:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>file:/etc/conf/auth.properties</value>
        </list>
    </property>
</bean>

答案 1 :(得分:1)

一种解决方案是使用Maven Build Helper Plugin并执行目标:

  

附加资源

完整的例子是:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.3</version>
    <executions>
        <execution>
            <id>add-resources</id>
            <phase>process-resources</phase>
            <goals>
                <goal>add-resource</goal>
            </goals>
            <configuration>
                <resources>
                    <resource>
                        <directory>../data-module/src/main/resources</directory>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>

另一种方法是使用Maven Resources Plugin和目标

  

复制资源

对于这个插件,用法与此类似:

<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
    <execution>
        <id>copy-resources</id>
        <phase>generate-resources</phase>
        <goals>
            <goal>copy-resources</goal>
        </goals>
        <configuration>
            <outputDirectory>src/main/resources</outputDirectory>
            <overwrite>true</overwrite>
            <resources>
                <resource>
                    <directory>../data-module/src/main/resources</directory>
                    <includes>
                        <include>*.properties</include>
                    </includes>
                </resource>
            </resources>
        </configuration>
    </execution>
</executions>

这两个插件都可以帮助完成这样的任务。