【问题标题】:jboss 7 deployment issues with warjboss 7 部署问题与战争
【发布时间】:2013-01-09 16:13:59
【问题描述】:

我们正在使用 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 中设置的,但插件中的配置似乎有些破坏它。

【问题讨论】:

    标签: jboss jboss7.x


    【解决方案1】:

    您可以定义一个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>
    

    【讨论】:

    • 是的,我已经尝试过了,它已部署,但它同时将运行时名称和名称更改为新名称。我可以看到它使用我在 jboss 控制台中设置的 部署,并且控制台说它正在运行。问题是,即使 jboss 说它现在已部署,它也没有注册 webContext,我无法再使用 webContext 通过浏览器访问应用程序。这是在 jboss-web.xml 文件中设置的。如果我从配置中删除 字段,它将使用 war 文件名部署,我可以访问它。我在日志中看不到任何错误。我确实 grep 日志。
    • 我看到,当未配置 时,控制台会显示它正在正确注册 webContext 并且一切正常。我使用相同的 war 文件,但现在我在配置部分添加了 ,它使用此名称部署它,但日志从不显示 webContext 已配置。就像 出于某种原因弄乱了 webContext。
    • 这很奇怪。您使用的是最新版本的插件 7.3.Final 吗?它可能不会真正有所作为,但也许。明天我也去看看。
    【解决方案2】:

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

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

    【讨论】:

    • 保留版本的一个选项是为旧版本添加一个取消部署目标。我意识到这不太理想,但您至少可以保留版本号。
    • 是的,我也想过,但我们需要跟踪以前的版本,这也有点痛苦。但如果我们这样做,那也行得通。
    • 我继续为它创建了一个 JIRA issues.jboss.org/browse/JBASMP-32 我很快就会尝试在这里查看它。
    • 终于解决了这个问题。你能解释一下你是如何设置 webContext 以及你在哪里设置的吗?
    【解决方案3】:

    这篇文章似乎回答了你的问题。 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>  
    

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

    <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"
    

    【讨论】:

      【解决方案4】:

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

      这似乎是 maven Jboss 插件中的一个限制:http://docs.jboss.org/jbossas/7/plugins/maven/latest/deploy-mojo.html。目前仅支持覆盖 JBoss 管理控制台中的 Name 和 Runtime Name 的 'name' 参数。

      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-02-06
        • 1970-01-01
        • 1970-01-01
        • 2011-01-24
        • 2012-10-20
        • 1970-01-01
        • 2018-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多