Commit 5bd9a445 authored by Andy Wilkinson's avatar Andy Wilkinson

Merge branch '2.0.x'

parents db7789ad 6f2171c2
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -22,6 +22,7 @@ import java.util.Objects; ...@@ -22,6 +22,7 @@ import java.util.Objects;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.function.Supplier; import java.util.function.Supplier;
import org.gradle.api.InvalidUserDataException;
import org.gradle.api.Project; import org.gradle.api.Project;
import org.gradle.api.file.FileCollection; import org.gradle.api.file.FileCollection;
...@@ -66,7 +67,8 @@ final class MainClassConvention implements Callable<Object> { ...@@ -66,7 +67,8 @@ final class MainClassConvention implements Callable<Object> {
private String resolveMainClass() { private String resolveMainClass() {
return this.classpathSupplier.get().filter(File::isDirectory).getFiles().stream() return this.classpathSupplier.get().filter(File::isDirectory).getFiles().stream()
.map(this::findMainClass).filter(Objects::nonNull).findFirst() .map(this::findMainClass).filter(Objects::nonNull).findFirst()
.orElse(null); .orElseThrow(() -> new InvalidUserDataException(
"Main class name has not been configured and it could not be resolved"));
} }
private String findMainClass(File file) { private String findMainClass(File file) {
......
...@@ -39,7 +39,6 @@ public interface BootArchive extends Task { ...@@ -39,7 +39,6 @@ public interface BootArchive extends Task {
* @return the main class name * @return the main class name
*/ */
@Input @Input
@Optional
String getMainClassName(); String getMainClassName();
/** /**
......
...@@ -42,10 +42,10 @@ public class BootJar extends Jar implements BootArchive { ...@@ -42,10 +42,10 @@ public class BootJar extends Jar implements BootArchive {
private final CopySpec bootInf; private final CopySpec bootInf;
private FileCollection classpath;
private String mainClassName; private String mainClassName;
private FileCollection classpath;
/** /**
* Creates a new {@code BootJar} task. * Creates a new {@code BootJar} task.
*/ */
...@@ -76,6 +76,13 @@ public class BootJar extends Jar implements BootArchive { ...@@ -76,6 +76,13 @@ public class BootJar extends Jar implements BootArchive {
@Override @Override
public String getMainClassName() { public String getMainClassName() {
if (this.mainClassName == null) {
String manifestStartClass = (String) getManifest().getAttributes()
.get("Start-Class");
if (manifestStartClass != null) {
setMainClassName(manifestStartClass);
}
}
return this.mainClassName; return this.mainClassName;
} }
......
...@@ -68,6 +68,13 @@ public class BootWar extends War implements BootArchive { ...@@ -68,6 +68,13 @@ public class BootWar extends War implements BootArchive {
@Override @Override
public String getMainClassName() { public String getMainClassName() {
if (this.mainClassName == null) {
String manifestStartClass = (String) getManifest().getAttributes()
.get("Start-Class");
if (manifestStartClass != null) {
setMainClassName(manifestStartClass);
}
}
return this.mainClassName; return this.mainClassName;
} }
......
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -104,6 +104,14 @@ public class JavaPluginActionIntegrationTests { ...@@ -104,6 +104,14 @@ public class JavaPluginActionIntegrationTests {
assertThat(result.task(":jar").getOutcome()).isEqualTo(TaskOutcome.SKIPPED); assertThat(result.task(":jar").getOutcome()).isEqualTo(TaskOutcome.SKIPPED);
} }
@Test
public void errorMessageIsHelpfulWhenMainClassCannotBeResolved() {
BuildResult result = this.gradleBuild.buildAndFail("build", "-PapplyJavaPlugin");
assertThat(result.task(":bootJar").getOutcome()).isEqualTo(TaskOutcome.FAILED);
assertThat(result.getOutput()).contains(
"Main class name has not been configured and it could not be resolved");
}
@Test @Test
public void jarAndBootJarCanBothBeBuilt() { public void jarAndBootJarCanBothBeBuilt() {
BuildResult result = this.gradleBuild.build("assemble"); BuildResult result = this.gradleBuild.build("assemble");
......
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -72,4 +72,12 @@ public class WarPluginActionIntegrationTests { ...@@ -72,4 +72,12 @@ public class WarPluginActionIntegrationTests {
this.gradleBuild.getProjectDir().getName() + "-boot.war")); this.gradleBuild.getProjectDir().getName() + "-boot.war"));
} }
@Test
public void errorMessageIsHelpfulWhenMainClassCannotBeResolved() {
BuildResult result = this.gradleBuild.buildAndFail("build", "-PapplyWarPlugin");
assertThat(result.task(":bootWar").getOutcome()).isEqualTo(TaskOutcome.FAILED);
assertThat(result.getOutput()).contains(
"Main class name has not been configured and it could not be resolved");
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment