Java 并行运行两台Jetty服务器

Java 并行运行两台Jetty服务器,java,gradle,jetty,Java,Gradle,Jetty,我有两个项目: A --build.gradle B --build.gradle settings.gradle // With: include 'A', 'B' 设置非常简单,每个项目都是一个简单的Jetty服务器: public static void main(String[] args) throws Exception { String location = "src/main/webapp/"; Server server = new Server(8080

我有两个项目:

A
--build.gradle

B
--build.gradle

settings.gradle // With: include 'A', 'B'
设置非常简单,每个项目都是一个简单的Jetty服务器:

public static void main(String[] args) throws Exception {
    String location = "src/main/webapp/";
    Server server = new Server(8080);
    WebAppContext webapp = new WebAppContext();

    webapp.setContextPath("/");
    webapp.setResourceBase(location);

    server.setHandler(webapp);
    server.start();
    server.join();
}
当我使用
gradlew run
时,它只会生成一定百分比的内容,因为在生成一个项目后,服务器在前台运行,而第二个项目不会生成


Gradle有一个好的解决方案吗?或者我必须创建胖jar并通过编译后任务手动执行吗?

您正在硬编码端口(8080)。两台服务器不能在同一端口启动。如果您可以将端口外部化为配置文件,并有两个不同的端口可启动,则应该可以解决您的问题


如果外部化到配置文件似乎很困难,那么将其作为环境参数

您可以按照Tomás Lins ExecWait()的思路进行一些修改

简言之;Lin使名为ExecWait的任务侦听字符串输出,然后将任务标记为已完成

可能对你有用的东西: 在Jetty服务器中添加要等待的字符串

server.start();
System.out.println("We have liftoff");
server.join()
以您自己的方式创建ExecWait任务

class ExecWait extends DefaultTask {
    String command
    String ready
    String directory

    @TaskAction
    def spawnProcess() {

        ProcessBuilder builder = new ProcessBuilder(command.split(' '))
        builder.redirectErrorStream(true)
        builder.directory(new File(directory))
        Process process = builder.start()

        InputStream stdout = process.getInputStream()
        BufferedReader reader = new BufferedReader(new
InputStreamReader(stdout))

        def line
        while ((line = reader.readLine()) != null) {
            println line
            if (line.contains(ready)) {
                println "$command is ready"
                break;
            }
        }
    }
}
沿着

task 'run-A-server'(dependsOn: 'jar', type: ExecWait) {
    doFirst {
        command "java " +                
                "-cp ${configurations.runtime.files.collect { it.absolutePath }.join(':')}:${jar.archivePath} " +
                "company.jetty.Main"
        ready "We have liftoff"
        directory "."
    }

}
杀戮任务也很方便。这应该行得通

def freePort(int port) {
    def cmd = "lsof -Fp -i :$port"
    def process = cmd.execute()
    process.in.eachLine { line ->
        def killProcess = "kill -9 ${line.substring(1)}".execute()
        killProcess.waitFor()
    }
}
task 'kill-A-server'() <<{
  freePort(project.portServerA)
}
def自由端口(int端口){
def cmd=“lsof-Fp-i:$port”
def process=cmd.execute()
process.in.eachLine{line->
def killProcess=“kill-9${line.substring(1)}”.execute()
killProcess.waitFor()
}
}

任务'kill-A-server'()您可以从其他控制台运行它。