Commit 4a40e8f8 authored by Dave Syer's avatar Dave Syer

Support for main class detection in installApp

I'm sure someone can do a better job of this, but here's a proposal
that works. It uses our FindMainTask to set the relevant properties
if theu are missing in the application plugin.

Fixes gh-1105
parent 3a8a1272
...@@ -16,10 +16,7 @@ ...@@ -16,10 +16,7 @@
package org.springframework.boot.gradle; package org.springframework.boot.gradle;
import java.io.IOException;
import org.gradle.tooling.ProjectConnection; import org.gradle.tooling.ProjectConnection;
import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
import org.springframework.boot.dependency.tools.ManagedDependencies; import org.springframework.boot.dependency.tools.ManagedDependencies;
...@@ -30,19 +27,25 @@ import org.springframework.boot.dependency.tools.ManagedDependencies; ...@@ -30,19 +27,25 @@ import org.springframework.boot.dependency.tools.ManagedDependencies;
*/ */
public class InstallTests { public class InstallTests {
private static ProjectConnection project; private ProjectConnection project;
private static final String BOOT_VERSION = ManagedDependencies.get() private static final String BOOT_VERSION = ManagedDependencies.get().find(
.find("spring-boot").getVersion(); "spring-boot").getVersion();
@BeforeClass @Test
public static void createProject() throws IOException { public void cleanInstall() throws Exception {
project = new ProjectCreator().createProject("installer"); project = new ProjectCreator().createProject("installer");
project.newBuild().forTasks("install").withArguments(
"-PbootVersion=" + BOOT_VERSION, "--stacktrace").run();
} }
@Test @Test
public void cleanInstall() { public void cleanInstallApp() throws Exception {
project.newBuild().forTasks("install").withArguments("-PbootVersion=" + BOOT_VERSION, "--stacktrace").run(); project = new ProjectCreator().createProject("install-app");
// "install" from the application plugin was renamed "installApp" in Gradle
// 1.0
project.newBuild().forTasks("installApp").withArguments(
"-PbootVersion=" + BOOT_VERSION, "--stacktrace", "--info").run();
} }
} }
buildscript {
repositories {
mavenLocal()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${project.bootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'spring-boot'
group = 'installer'
version = '0.0.0'
run {
main = 'org.springframework.boot.SpringApplication'
}
jar {
baseName = 'install-app'
}
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
compile "org.springframework.boot:spring-boot-starter"
}
...@@ -29,7 +29,7 @@ import org.springframework.boot.gradle.PluginFeatures; ...@@ -29,7 +29,7 @@ import org.springframework.boot.gradle.PluginFeatures;
*/ */
public class RepackagePluginFeatures implements PluginFeatures { public class RepackagePluginFeatures implements PluginFeatures {
private static final String REPACKAGE_TASK_NAME = "bootRepackage"; public static final String REPACKAGE_TASK_NAME = "bootRepackage";
@Override @Override
public void apply(Project project) { public void apply(Project project) {
......
...@@ -56,6 +56,10 @@ public class RepackageTask extends DefaultTask { ...@@ -56,6 +56,10 @@ public class RepackageTask extends DefaultTask {
this.mainClass = mainClass; this.mainClass = mainClass;
} }
public String getMainClass() {
return mainClass;
}
@TaskAction @TaskAction
public void repackage() { public void repackage() {
Project project = getProject(); Project project = getProject();
......
package org.springframework.boot.gradle.run; package org.springframework.boot.gradle.run;
import java.io.IOException; import java.io.IOException;
import org.gradle.api.DefaultTask; import org.gradle.api.DefaultTask;
import org.gradle.api.Project; import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.plugins.ApplicationPluginConvention;
import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.TaskAction;
import org.springframework.boot.gradle.SpringBootPluginExtension; import org.springframework.boot.gradle.SpringBootPluginExtension;
...@@ -29,28 +32,55 @@ public class FindMainClassTask extends DefaultTask { ...@@ -29,28 +32,55 @@ public class FindMainClassTask extends DefaultTask {
private String findMainClass() { private String findMainClass() {
Project project = getProject(); Project project = getProject();
String mainClass = null;
// Try the SpringBoot extension setting // Try the SpringBoot extension setting
SpringBootPluginExtension bootExtension = project.getExtensions().getByType( SpringBootPluginExtension bootExtension = project.getExtensions().getByType(
SpringBootPluginExtension.class); SpringBootPluginExtension.class);
if(bootExtension.getMainClass() != null) { if (bootExtension.getMainClass() != null) {
return bootExtension.getMainClass(); mainClass = bootExtension.getMainClass();
} }
ApplicationPluginConvention application = (ApplicationPluginConvention) project.getConvention().getPlugins().get(
"application");
// Try the Application extension setting
if (mainClass == null && application.getMainClassName() != null) {
mainClass = application.getMainClassName();
}
Task runTask = getProject().getTasks().getByName("run");
if (mainClass == null && runTask.hasProperty("main")) {
mainClass = (String) runTask.property("main");
}
if (mainClass == null) {
// Search // Search
SourceSet mainSourceSet = SourceSets.findMainSourceSet(project); SourceSet mainSourceSet = SourceSets.findMainSourceSet(project);
if (mainSourceSet == null) { if (mainSourceSet != null) {
return null;
}
project.getLogger().debug( project.getLogger().debug(
"Looking for main in: " + mainSourceSet.getOutput().getClassesDir()); "Looking for main in: "
+ mainSourceSet.getOutput().getClassesDir());
try { try {
String mainClass = MainClassFinder.findSingleMainClass(mainSourceSet mainClass = MainClassFinder.findSingleMainClass(mainSourceSet.getOutput().getClassesDir());
.getOutput().getClassesDir());
project.getLogger().info("Computed main class: " + mainClass); project.getLogger().info("Computed main class: " + mainClass);
return mainClass; } catch (IOException ex) {
}
catch (IOException ex) {
throw new IllegalStateException("Cannot find main class", ex); throw new IllegalStateException("Cannot find main class", ex);
} }
} }
}
project.getLogger().info("Found main: " + mainClass);
if (bootExtension.getMainClass() == null) {
bootExtension.setMainClass(mainClass);
}
if (application.getMainClassName() == null) {
application.setMainClassName(mainClass);
}
if (!runTask.hasProperty("main")) {
runTask.setProperty("main", mainClass);
}
return mainClass;
}
} }
...@@ -23,6 +23,7 @@ import org.gradle.api.Project; ...@@ -23,6 +23,7 @@ import org.gradle.api.Project;
import org.gradle.api.Task; import org.gradle.api.Task;
import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.api.plugins.JavaPluginConvention;
import org.gradle.api.tasks.JavaExec; import org.gradle.api.tasks.JavaExec;
import org.gradle.api.tasks.application.CreateStartScripts;
import org.springframework.boot.gradle.PluginFeatures; import org.springframework.boot.gradle.PluginFeatures;
/** /**
...@@ -47,7 +48,7 @@ public class RunPluginFeatures implements PluginFeatures { ...@@ -47,7 +48,7 @@ public class RunPluginFeatures implements PluginFeatures {
project.getTasks().all(new Action<Task>() { project.getTasks().all(new Action<Task>() {
@Override @Override
public void execute(Task task) { public void execute(Task task) {
if(task instanceof JavaExec) { if(task instanceof JavaExec || task instanceof CreateStartScripts) {
task.dependsOn(FIND_MAIN_CLASS_TASK_NAME); task.dependsOn(FIND_MAIN_CLASS_TASK_NAME);
} }
} }
......
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