Gradle:使用Jetty运行多个webapps

时间:2014-05-07 10:10:16

标签: gradle jetty war

我想将同一个Gradle项目创建的两个webapp运行到Jetty服务器中。让我们称这两个网络用户为#n; ninja"和"战士"。

两个webapp都非常相似,它们仅在应用程序上下文文件(在web.xml文件中引用)和资源上有所不同。

为了部署它们,接受这两个选项:

  • 使用不同的端口:
http://www.example.com:8080/app (ninja webapp)
http://www.example.com:8081/app (warrior webapp)
  • 使用不同的路径:
http://www.example.com:8080/ninja_app
http://www.example.com:8080/warrior_app

有一个或两个Jetty实例应该可以用于这个项目。

这是我的项目布局:

/src/main/java
/src/main/resources
/src/main/webapp (ninja webapp)
/src/main/webapp-warrior

第一个问题:如何使用Gradle创建两个war文件?

第二个问题:如何使用Gradle在Jetty服务器中部署两个war文件?

4 个答案:

答案 0 :(得分:7)

请查看 Gretty gradle插件:https://github.com/akhikhl/gretty

它支持多个开箱即用的网络应用程序。它可以帮助您:

  1. 运行“inplace”的web-app项目,即从已编译的类
  2. 运行
  3. 将web-app项目作为WAR文件运行
  4. 从文件系统运行非项目WAR文件
  5. 从maven存储库运行非项目WAR文件(当然,首先下载WAR)
  6. 此外,你可以:

    • 在任何Java IDE调试器下的同一Jetty服务器上调试多个web-apps。
    • 在同一个Jetty服务器上与多个Web应用程序执行集成测试。
    • 使用Jacoco执行代码覆盖 - 包括客户端和服务器端。

    有很多文档可以帮助解决所有问题:http://akhikhl.github.io/gretty-doc/

    披露:我是Gretty插件的作者。

    快乐编码:)

答案 1 :(得分:3)

如果您不想创建两个不同的项目,可能需要使用Gradle中的apply from:功能创建两个不同的gradle配置文件。

对于每个webapp实例,ninja和warrior,您必须创建一个脚本文件,其中包含特定于该配置文件的所有信息。

在这些新的gradle构建文件ninja-profile.gradle和warrior-profile.gradle中,您可以设置不同于ninja和warrior的特定配置,在这种情况下可以是:

  1. 资源文件夹:您可以为其创建单独的资源文件夹 每个实例
  2. Jetty配置:如果你想运行两个 2个webapps的不同实例,每个实例都是分开的 码头实例。
  3. 在你的" main"构建文件,您可以定义所有配置文件和构建需求的常用内容,另外还要添加以下行:

    apply from: "${profile}-profile.gradle"
    

    运行Gradle时,您可以使用-P选项传递配置文件的名称:

    $ gradle -Pprofile=ninja tasks 
    

    $ gradle -Pprofile=warrior tasks
    

答案 2 :(得分:1)

我们最终实现了一个解决方案,其中为两个项目创建了sourceSets,因此目录布局为:

  • /src/main/java:包含两个项目的公共类
  • /src/main/webapp:包含两个项目的常见Web应用程序。
  • /src/ninjaMain/resources:包含忍者项目的特定资源
  • /src/warriorMain/resources:包含战士项目的特定资源

然后,build.gradle文件被配置为创建两个war文件。之后,两个war文件都使用货物和码头部署在同一个webapp容器中:

apply 'java'
apply 'war'
apply 'cargo'


task createNinjaWar(type: War, dependsOn: classes) {
    baseName = 'ninja'      
    from file('src/main/webapp')
    destinationDir = file("$buildDir/dist")     
    webInf {
        from ('src/ninjaMain/resources') { into 'classes' }
    }
}

task createWarriorWar(type: War, dependsOn: classes) {  
    baseName = 'warrior'    
    from file('src/main/webapp')
    destinationDir = file("$buildDir/dist")                 
    webInf {
        from ('src/warriorMain/resources') { into 'classes' }       
    }
}    

// Deploy
cargo {
    containerId = 'jetty9x'
    port = 8080
    deployable {
        context = 'ninja'           
        file = createNinjaWar.archivePath
    }
    deployable {
        context = 'warrior'
        file = createWarriorWar.archivePath
    }
}

现在是两个Web应用程序的访问URL:

  • http://www.example.com:8080/ninja
  • http://www.example.com:8080/warrior

答案 3 :(得分:0)

为了更好的可读性,代码组织和更简单的维护,这两个项目应该分开。然后可以为每个项目单独应用和配置jetty插件,并且所有env都可以在父build.gradle文件中启动。