1

我们正在使用 jboss 7 和 jboss-as-maven-plugin 来自动部署我们的战争文件。我们有一个 web.xml,其 contextRoot 设置为我们的应用程序名称。在插件中,我们将文件名配置为 ${project.build.finalName}.${project.packaging}。它部署得很好,但问题是当我们更改版本号时我们的战争文件名发生更改。

例如,当我们准备发布下一个版本时,战争从 myproject-v1.0.1.war 更改为 myproject-v1.0.2.war。问题是当 maven jboss 插件运行并尝试部署 war 文件时。注意我们已将 force 设置为 true,因此它应该取消部署旧应用程序并部署新应用程序。

问题是在确定应用程序当前是否已部署时,它似乎关闭了 war 文件名而不是 webContext。所以新版本无法部署,因为旧版本仍在运行。我们必须进入并手动取消部署以前的版本,然后重新部署。旧应用程序的强制取消部署似乎是基于战争名称,并且由于版本号发生变化,它认为它没有部署并让旧版本运行。这导致它失败,因为 webContext 已被使用。

我们试图将插件中的配置更改为通用的并且可以正常工作(运行时名称和名称显示此名称,而不是战争文件名)。但唯一的问题是这似乎会影响 jboss 上的某些东西,虽然它说它部署的 webContext 无效,我们无法访问我们的应用程序。这很奇怪,因为 webContext 是在 web.xml 中设置的,但插件中的配置似乎有些破坏它。

4

4 回答 4

0

name您可以定义一个配置属性。那应该覆盖部署名称。如果未设置,则使用文件名。

<project>
    ...
    <build>
        ...
        <plugins>
            ...
            <plugin>
                <groupId>org.jboss.as.plugins</groupId>
                <artifactId>jboss-as-maven-plugin</artifactId>
                <version>7.3.Final</version>
                <configuration>
                    <name>your-app</name>
                </configuration>
            </plugin>
            ...
        </plugins>
        ...
    </build>
...
</project>
于 2013-01-09T18:46:10.813 回答
0

因此,在玩了一段时间之后,我们找不到任何理由说明为什么当我们使用配置时它会部署但 webContext 没有设置。但是当我们手动部署相同的 WAR 时,它会设置 webContext。

所以最后。我们最终做的是将战争的名称改为通用名称。因此,与其将 myapp_v_1_0_1.war 改为 myapp.war,不如将其命名为 myapp.war。这很痛苦,因为现在我们仅通过查看控制台不知道部署了哪个版本。我们需要点击显示版本号的应用程序。但是通过这样做,它解决了我们取消部署旧应用程序的问题,但产生了一个新问题,即通过控制台确定部署的版本并不容易。

于 2013-01-10T16:11:50.170 回答
0

这篇文章似乎回答了你的问题。 https://community.jboss.org/wiki/HowdoIoverridethewebcontextroot

我在自己的项目上尝试过,它有效!基本上,创建一个 jboss-web.xml(现在您的项目是特定的,一次编写就可以在任何地方部署)。使 jboss-web.xml 看起来像...

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>  
    <context-root>/rmbMavenCounter</context-root>  
</jboss-web>  

从 jboss-as-plugin 的 pom.xml 中删除配置。我的插件现在看起来像

<build>
    <plugins>
                    .....
        <plugin>
            <groupId>org.jboss.as.plugins</groupId>
            <artifactId>jboss-as-maven-plugin</artifactId>
            <version>7.4.Final</version>
        </plugin>
    </plugins>
</build>

它将在 jboss 管理控制台中使用快照名称进行部署,但您可以使用文本字符串来访问您的应用程序。例如,我使用以下链接访问上述应用程序。

http://localhost:8080/rmbMavenCounter/

这是我的 jboss Web 服务器控制台的部署...

08:12:42,413 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-16) JBAS015876: Starting deployment of "mavenCounter2-0.0.1-SNAPSHOT.war"
08:12:42,606 INFO  [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-4) Initializing Mojarra 2.1.5 (SNAPSHOT 20111202) for context '/rmbMavenCounter'
08:12:42,663 INFO  [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-4) Monitoring jndi:/default-host/rmbMavenCounter/WEB-INF/faces-config.xml for modifications
08:12:42,665 INFO  [org.jboss.web] (MSC service thread 1-4) JBAS018210: Registering web context: /rmbMavenCounter
08:12:42,678 INFO  [org.jboss.as.server] (management-handler-threads - 30) JBAS018559: Deployed "mavenCounter2-0.0.1-SNAPSHOT.war"
于 2013-10-21T13:20:17.410 回答
0

我遇到了同样的问题:我想使用版本和内部版本号上传战争以便于识别,但同时根据其名称覆盖以前的服务(没有版本/内部版本号)。

这似乎是 maven Jboss 插件的一个限制:http: //docs.jboss.org/jbossas/7/plugins/maven/latest/deploy-mojo.html。当前仅支持覆盖 JBoss 管理控制台中的名称和运行时名称的“名称”参数。

  1. 我会说插件需要长期支持 'runtimeName' 以及在 maven 'deploy' 目标的参数列表中。

  2. 不过,您可以做的是首先使用“取消部署”目标取消部署服务,然后使用“matchPattern”参数找到您以前的服务,即使它包含版本/构建名称。

当然缺点是必须取消部署;这不太适合生产环境。

以你为例:

<plugin>
  <groupId>org.jboss.as.plugins</groupId>
  <artifactId>jboss-as-maven-plugin</artifactId>
  <configuration>
    <port>${JBOSS_PORT}</port>
    <username>${JBOSS_USERNAME}</username>
    <password>${JBOSS_PASSWORD}</password>
    <force>true</force>
    <ignoreMissingDeployment>true</ignoreMissingDeployment>
  </configuration>
  <executions>
    <execution>
      <id>undeploy-MyProject</id>
      <phase>install</phase>
      <goals>
        <goal>undeploy</goal>
      </goals>
      <configuration>
        <hostname>${HOSTNAME}</hostname>
        <matchPattern>myproject.*\.war</matchPattern>
      </configuration>
    </execution>
    <execution>
      <id>deploy-MyProject</id>
      <phase>install</phase>
      <goals>
      <goal>deploy</goal>
      </goals>
      <configuration>
        <hostname>${HOSTNAME}</hostname>
        <name>myproject-${project.version}.war</name>
        <filename>target/myproject-${project.version}.war</filename>
      </configuration>
    </execution>
  </executions>
</plugin>
于 2013-12-30T12:11:33.713 回答