首页 文章

Gradle:使用Jetty运行多个webapps

提问于
浏览
4

我想将同一个Gradle项目创建的两个webapp运行到Jetty服务器中 . 让我们称这两个webapps为“ninja”和“warrior” .

两个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 回答

  • 1

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

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

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

    • Resources文件夹:您可以为每个实例创建一个单独的资源文件夹

    • Jetty配置:如果要运行两个不同的2个webapp实例,每个实例都在一个独立的jetty实例中 .

    在“main”构建文件中,您可以定义所有配置文件和构建需求的常用内容,并添加以下行:

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

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

    $ gradle -Pprofile=ninja tasks
    

    要么

    $ gradle -Pprofile=warrior tasks
    
  • 7

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

    它支持多个开箱即用的Web应用程序 . 它可以帮助您:

    • 运行web-app项目"inplace",即来自已编译的类

    • 将web-app项目作为WAR文件运行

    • 从文件系统运行非项目WAR文件

    • 从maven存储库运行非项目WAR文件(当然,首先下载WAR)

    此外,您可以:

    • 在任何Java IDE调试器下的同一Jetty服务器上调试多个web-apps .

    • 在同一Jetty服务器上对多个Web应用程序执行集成测试 .

    • 使用Jacoco执行代码覆盖 - 包括客户端和服务器端 .

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

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

    快乐编码:)

  • 3

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

    • /src/main/java :包含两个项目的公共类

    • /src/main/webapp :包含两个项目的常用webapp .

    • /src/ninjaMain/resources :包含忍者项目的特定资源

    • /src/warriorMain/resources :包含warrior项目的特定资源

    然后,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

  • 0

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

相关问题