我有两个项目:
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并通过后编译任务手动完成?
答案 0 :(得分:0)
您正在对端口进行硬编码(8080)。两台服务器无法在同一端口启动。如果您可以将端口外部化为配置文件并启动两个不同的端口,则应解决您的问题。
如果外部化配置文件似乎很困难,请将其设为环境参数
答案 1 :(得分:0)
你可以按照TomásLinsExecWait(http://fbflex.wordpress.com/2013/03/14/gradle-madness-execwait-a-task-that-waits-for-commandline-calls-to-be-ready/)的方式做一些黑客攻击
总之; Lin创建一个名为ExecWait的任务,它侦听String输出,然后将任务标记为已完成。
可能对您有用的东西: 在您的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;
}
}
}
}
中的几个ExecWait任务
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)
}
添加一些mustRunAfter,dependsOn你在哪里找到usefil,你应该有一些可能适合自己喜欢的东西。