/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * License); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an AS IS BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

apply plugin: 'org.apache.beam.module'
apply plugin: 'application'
applyJavaNature(
  automaticModuleName: 'org.apache.beam.sdk.expansion.service.app',
  validateShadowJar: false,
  shadowClosure: {},
)
mainClassName = "org.apache.beam.sdk.expansion.service.ExpansionService"


description = "Apache Beam :: SDKs :: Java :: Expansion Service :: App"
ext.summary = """Runs an expansion service."""


dependencies {
  implementation project(":sdks:java:expansion-service")
  permitUnusedDeclared project(":sdks:java:expansion-service")
  runtimeOnly library.java.slf4j_jdk14
}

task runExpansionService (type: JavaExec) {
  mainClass = "org.apache.beam.sdk.expansion.service.ExpansionService"
  classpath = sourceSets.main.runtimeClasspath
  args = [project.findProperty("constructionService.port") ?: "8097"]
}
