如何为Jetty的Maven Cargo插件指定jetty-env.xml文件?

时间:2010-10-28 04:05:58

标签: java web-applications maven-2 jetty maven-cargo

我正在从Maven的jetty插件迁移到Cargo插件(cargo-maven2-plugin),因为Cargo将很乐意从依赖的Maven模块运行WAR。在网络应用程序中,我们花了很大力气通过JNDI外部化所有配置。这些JNDI定义是特定于Web应用程序的,因此放在WAR外部的jetty-env.xml文件中。使用Jetty插件,我们按如下方式指定了这个文件:

        <plugin>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>maven-jetty-plugin</artifactId>
            <configuration>
                <jettyEnvXml>${basedir}/target/config/jetty-env.xml</jettyEnvXml>
            </configuration>
        </plugin>

如何在Cargo插件中指定这个?这是我到目前为止的配置。当然,由于缺少JNDI配置,它失败了:

        <plugin>
                <groupId>org.codehaus.cargo</groupId>
                <artifactId>cargo-maven2-plugin</artifactId>
                <configuration>
                    <container>
                        <containerId>jetty6x</containerId>
                        <type>embedded</type>
                    </container>
                    <configuration>
                        <deployables>
                            <deployable>
                                <groupId>com.mycompany</groupId>
                                <artifactId>my-war-module</artifactId>
                                <type>war</type>
                                <properties>
                                   <context>/</context>
                                </properties>
                            </deployable>
                        </deployables>
                    </configuration>
                    <wait>false</wait>
                </configuration>
                <executions>
                           ......
                </executions>
        </plugin>

4 个答案:

答案 0 :(得分:3)

根据CARGO-804,Cargo的Jetty部署者现在支持在你的战争中嵌入jetty-env.xml (从版本1.0.3开始)。

为了让jetty-env.xml保持在“真正的”战争之外,我的建议是创建一个额外的战争模块来托管jetty-env.xml文件并将货物配置为merge WAR files(要特别注意<extensions>true</extensions>中重要的{{1}}元素,如CARGO-524中所述。

答案 1 :(得分:1)

我遇到同样的问题,希望有一个干净的安装。我没有被WAR文件的合并所吸引。相反,我使用程序集来维护所有外部属性的ZIP文件。作为一个单独的模块,我可以将ZIP文件的内容部署到JETTY环境。反过来,我利用Jetty如何使用Web应用程序的名称来加载一个免费的环境文件(对于webapps / foo.war,Jetty使用contexts / foo.xml进行配置)。因此,虽然它不像纯货物解决方案那样紧凑,但我更喜欢它,因为WAR文件在整个推广过程中都没有掺杂。该解决方案也是管理所有配置活动的一般机制。如果有人有兴趣,我可以指出更多细节。

答案 2 :(得分:1)

Mond的回答引发了一个想法,也许我可以使用Cargo的配置将我的(重命名的和略微修改的)jetty-env.xml存入“contexts”目录。让我感到惊讶的是Just Worked。我在这里做了什么:

对于我的货物配置,我添加了以下内容:

<configfiles>  
  <configfile>  
      <file>${basedir}/../config/jetty-env.xml</file>
    <todir>contexts</todir>
     <tofile>${jetty6.context}.xml</tofile>
   </configfile>
</configfiles>

但是为了将我的jetty-env.xml转换为真正的context.xml,我添加了以下内容:

<!-- Activates the Jetty-Plus feature so we can create/share JNDI resources -->
<Array id="plusConfig" type="java.lang.String">
    <Item>org.mortbay.jetty.webapp.WebInfConfiguration</Item>
    <Item>org.mortbay.jetty.plus.webapp.EnvConfiguration</Item>
    <Item>org.mortbay.jetty.plus.webapp.Configuration</Item>
    <Item>org.mortbay.jetty.webapp.JettyWebXmlConfiguration</Item>
    <Item>org.mortbay.jetty.webapp.TagLibConfiguration</Item>
</Array>

<!-- Miscellaneous properties that were take from the CARGO version of this file that is created automatically
    (and then replaced by this file). If you ever upgrade Cargo you may need to change these. -->
<Set name="contextPath">/${jetty6.context}</Set>
<Set name="war">
    <SystemProperty name="config.home" default="."/>/webapps/${jetty6.context}.war</Set>
<Set name="extractWAR">true</Set>
<Set name="defaultsDescriptor">
    <SystemProperty name="config.home" default="."/>/etc/webdefault.xml</Set>
<Set name="ConfigurationClasses">
    <Ref id="plusConfig" />
</Set>

我担心CARGO会在我复制我的文件后转储它自己的上下文文件,但它很聪明,可以最后复制它。

答案 3 :(得分:1)

我想做的其他事情是过滤属性。到目前为止,我有这个:

    <profile>
        <id>deploy-properties</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <properties>
            <deployable.classifier>properties</deployable.classifier>
            <deployable.type>zip</deployable.type>
            <ys.imq.user>UserFromDeploymentPom</ys.imq.user>
            <ys.imq.password>PasswordFromDeploymentPom</ys.imq.password>
        </properties>
        <dependencies>
            <dependency>
                <groupId>${project.groupId}</groupId>
                <artifactId>${deployable.artifactId}</artifactId>
                <classifier>${deployable.classifier}</classifier>
                <type>${deployable.type}</type>
                <version>${project.version}</version>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <executions>
                        <execution>
                            <phase>process-resources</phase>
                            <goals>
                                <goal>unpack</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>${project.groupId}</groupId>
                                <artifactId>${deployable.artifactId}</artifactId>
                                <classifier>${deployable.classifier}</classifier>
                                <version>${project.version}</version>
                                <type>${deployable.type}</type>
                                <overWrite>true</overWrite>
                                <outputDirectory>/tmp/${deployable.artifactId}</outputDirectory>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </plugin>
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>2.4.3</version>
                    <executions>
                        <execution>
                            <id>copy-resources</id>
                            <phase>package</phase>
                            <goals>
                                <goal>copy-resources</goal>
                            </goals>
                            <configuration>
                                <outputDirectory>${deploy.jettyHome}</outputDirectory>
                                <overwrite>true</overwrite>
                                <resources>
                                    <resource>
                                        <directory>/tmp/${deployable.artifactId}</directory>
                                        <filtering>true</filtering>
                                    </resource>
                                </resources>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>

它比我喜欢的要复杂一些,但允许我在将它们添加到Jetty时过滤属性。这使得可以使用系统属性覆盖密码和其他机密数据。我们正在使用Bamboo(我猜Hudson类似),可以调整每个环境的计划。计划可能受访问控制。这使我们可以在一个地方设置所有部署属性,因此不再有管理员在Unix机器上进行攻击。