|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
|
|
<groupId>org.springframework.boot</groupId>
|
|
|
|
<artifactId>spring-boot-parent</artifactId>
|
|
|
|
<version>2.0.0.BUILD-SNAPSHOT</version>
|
|
|
|
<relativePath>../spring-boot-parent</relativePath>
|
|
|
|
</parent>
|
|
|
|
<artifactId>spring-boot-cli</artifactId>
|
|
|
|
<name>Spring Boot CLI</name>
|
|
|
|
<description>Spring Boot CLI</description>
|
|
|
|
<url>http://projects.spring.io/spring-boot/</url>
|
|
|
|
<organization>
|
|
|
|
<name>Pivotal Software, Inc.</name>
|
|
|
|
<url>http://www.spring.io</url>
|
|
|
|
</organization>
|
|
|
|
<properties>
|
|
|
|
<main.basedir>${basedir}/..</main.basedir>
|
|
|
|
<start-class>org.springframework.boot.cli.SpringCli</start-class>
|
|
|
|
<spring.profiles.active>default</spring.profiles.active>
|
|
|
|
<generated.pom.dir>${project.build.directory}/generated-resources/org/springframework/boot/cli/compiler/dependencies</generated.pom.dir>
|
|
|
|
</properties>
|
|
|
|
<profiles>
|
|
|
|
<profile>
|
|
|
|
<id>integration</id>
|
|
|
|
<activation>
|
|
|
|
<activeByDefault>true</activeByDefault>
|
|
|
|
</activation>
|
|
|
|
<properties>
|
|
|
|
<spring.profiles.active>integration</spring.profiles.active>
|
|
|
|
</properties>
|
|
|
|
</profile>
|
|
|
|
</profiles>
|
|
|
|
<dependencies>
|
|
|
|
<!-- Compile -->
|
Add a command to produce a self-contained executable JAR for a CLI app
A new command, jar, has been added to the CLI. The command can be
used to create a self-contained executable JAR file from a CLI app.
Basic usage is:
spring jar <jar-name> <source-files>
For example:
spring jar my-app.jar *.groovy
The resulting jar will contain the classes generated by compiling the
source files, all of the application's dependencies, and entries
on the application's classpath.
By default a CLI application has the current working directory on
its classpath. This can be overridden using the --classpath option.
Any file that is referenced directly by the classpath is always
included in the jar. Any file that is found a result of being
contained within a directory that is on the classpath is subject to
filtering to determine whether or not it should be included. The
default includes are public/**, static/**, resources/**,
META-INF/**, *. The default excludes are .*, repository/**, build/**,
target/**. To be included in the jar, a file must match one of the
includes and none of the excludes. The filters can be overridden using
the --include and --exclude options.
Closes #241
11 years ago
|
|
|
<dependency>
|
|
|
|
<groupId>org.springframework.boot</groupId>
|
Add a command to produce a self-contained executable JAR for a CLI app
A new command, jar, has been added to the CLI. The command can be
used to create a self-contained executable JAR file from a CLI app.
Basic usage is:
spring jar <jar-name> <source-files>
For example:
spring jar my-app.jar *.groovy
The resulting jar will contain the classes generated by compiling the
source files, all of the application's dependencies, and entries
on the application's classpath.
By default a CLI application has the current working directory on
its classpath. This can be overridden using the --classpath option.
Any file that is referenced directly by the classpath is always
included in the jar. Any file that is found a result of being
contained within a directory that is on the classpath is subject to
filtering to determine whether or not it should be included. The
default includes are public/**, static/**, resources/**,
META-INF/**, *. The default excludes are .*, repository/**, build/**,
target/**. To be included in the jar, a file must match one of the
includes and none of the excludes. The filters can be overridden using
the --include and --exclude options.
Closes #241
11 years ago
|
|
|
<artifactId>spring-boot-loader-tools</artifactId>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>com.vaadin.external.google</groupId>
|
|
|
|
<artifactId>android-json</artifactId>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>jline</groupId>
|
|
|
|
<artifactId>jline</artifactId>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>net.sf.jopt-simple</groupId>
|
|
|
|
<artifactId>jopt-simple</artifactId>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.codehaus.groovy</groupId>
|
|
|
|
<artifactId>groovy</artifactId>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.springframework</groupId>
|
|
|
|
<artifactId>spring-core</artifactId>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.apache.maven</groupId>
|
|
|
|
<artifactId>maven-aether-provider</artifactId>
|
|
|
|
<exclusions>
|
|
|
|
<exclusion>
|
|
|
|
<artifactId>org.eclipse.sisu.plexus</artifactId>
|
|
|
|
<groupId>org.eclipse.sisu</groupId>
|
|
|
|
</exclusion>
|
|
|
|
</exclusions>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.apache.maven</groupId>
|
|
|
|
<artifactId>maven-settings-builder</artifactId>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.codehaus.plexus</groupId>
|
|
|
|
<artifactId>plexus-component-api</artifactId>
|
|
|
|
<exclusions>
|
|
|
|
<exclusion>
|
|
|
|
<groupId>*</groupId>
|
|
|
|
<artifactId>*</artifactId>
|
|
|
|
</exclusion>
|
|
|
|
</exclusions>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.eclipse.aether</groupId>
|
|
|
|
<artifactId>aether-api</artifactId>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.eclipse.aether</groupId>
|
|
|
|
<artifactId>aether-connector-basic</artifactId>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.eclipse.aether</groupId>
|
|
|
|
<artifactId>aether-impl</artifactId>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.eclipse.aether</groupId>
|
|
|
|
<artifactId>aether-spi</artifactId>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.eclipse.aether</groupId>
|
|
|
|
<artifactId>aether-transport-file</artifactId>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.eclipse.aether</groupId>
|
|
|
|
<artifactId>aether-transport-http</artifactId>
|
|
|
|
<exclusions>
|
|
|
|
<exclusion>
|
|
|
|
<artifactId>jcl-over-slf4j</artifactId>
|
|
|
|
<groupId>org.slf4j</groupId>
|
|
|
|
</exclusion>
|
|
|
|
</exclusions>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.eclipse.aether</groupId>
|
|
|
|
<artifactId>aether-util</artifactId>
|
|
|
|
</dependency>
|
|
|
|
<!-- Provided -->
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.codehaus.groovy</groupId>
|
|
|
|
<artifactId>groovy-templates</artifactId>
|
|
|
|
<scope>provided</scope>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.springframework.boot</groupId>
|
|
|
|
<artifactId>spring-boot</artifactId>
|
|
|
|
<scope>provided</scope>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.springframework</groupId>
|
|
|
|
<artifactId>spring-web</artifactId>
|
|
|
|
<scope>provided</scope>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>javax.servlet</groupId>
|
|
|
|
<artifactId>javax.servlet-api</artifactId>
|
|
|
|
<scope>provided</scope>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>junit</groupId>
|
|
|
|
<artifactId>junit</artifactId>
|
|
|
|
<scope>provided</scope>
|
|
|
|
</dependency>
|
|
|
|
<!-- Test -->
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.springframework.boot</groupId>
|
|
|
|
<artifactId>spring-boot</artifactId>
|
|
|
|
<type>test-jar</type>
|
|
|
|
<scope>test</scope>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.springframework.boot</groupId>
|
|
|
|
<artifactId>spring-boot-test</artifactId>
|
|
|
|
<scope>test</scope>
|
|
|
|
</dependency>
|
|
|
|
</dependencies>
|
|
|
|
<build>
|
|
|
|
<resources>
|
|
|
|
<resource>
|
|
|
|
<directory>${project.build.directory}/generated-resources</directory>
|
|
|
|
</resource>
|
|
|
|
<resource>
|
|
|
|
<directory>${basedir}/src/main/resources</directory>
|
|
|
|
</resource>
|
|
|
|
</resources>
|
|
|
|
<plugins>
|
|
|
|
<plugin>
|
|
|
|
<groupId>org.apache.maven.plugins</groupId>
|
|
|
|
<artifactId>maven-failsafe-plugin</artifactId>
|
|
|
|
</plugin>
|
|
|
|
<plugin>
|
|
|
|
<groupId>org.apache.maven.plugins</groupId>
|
|
|
|
<artifactId>maven-surefire-plugin</artifactId>
|
|
|
|
<configuration>
|
|
|
|
<additionalClasspathElements>
|
|
|
|
<additionalClasspathElement>${project.build.directory}/generated-resources</additionalClasspathElement>
|
|
|
|
</additionalClasspathElements>
|
|
|
|
<systemPropertyVariables>
|
|
|
|
<spring.profiles.active>${spring.profiles.active}</spring.profiles.active>
|
|
|
|
</systemPropertyVariables>
|
|
|
|
</configuration>
|
|
|
|
</plugin>
|
|
|
|
<!-- Build an executable JAR manually since we can't easily depend on
|
|
|
|
a maven plugin that is part of the reactor -->
|
|
|
|
<plugin>
|
|
|
|
<groupId>org.apache.maven.plugins</groupId>
|
|
|
|
<artifactId>maven-dependency-plugin</artifactId>
|
|
|
|
<executions>
|
|
|
|
<execution>
|
|
|
|
<id>copy-effective-pom</id>
|
|
|
|
<phase>generate-resources</phase>
|
|
|
|
<goals>
|
|
|
|
<goal>copy</goal>
|
|
|
|
</goals>
|
|
|
|
<configuration>
|
|
|
|
<artifactItems>
|
|
|
|
<artifactItem>
|
|
|
|
<groupId>org.springframework.boot</groupId>
|
|
|
|
<artifactId>spring-boot-dependencies</artifactId>
|
|
|
|
<version>${project.version}</version>
|
|
|
|
<type>effective-pom</type>
|
|
|
|
<overWrite>true</overWrite>
|
|
|
|
<outputDirectory>${generated.pom.dir}</outputDirectory>
|
|
|
|
<destFileName>effective-pom.xml</destFileName>
|
|
|
|
</artifactItem>
|
|
|
|
</artifactItems>
|
|
|
|
</configuration>
|
|
|
|
</execution>
|
|
|
|
<execution>
|
|
|
|
<id>unpack</id>
|
|
|
|
<phase>prepare-package</phase>
|
|
|
|
<goals>
|
|
|
|
<goal>unpack</goal>
|
|
|
|
</goals>
|
|
|
|
<configuration>
|
|
|
|
<artifactItems>
|
|
|
|
<artifactItem>
|
|
|
|
<groupId>org.springframework.boot</groupId>
|
|
|
|
<artifactId>spring-boot-loader</artifactId>
|
|
|
|
<version>${project.version}</version>
|
|
|
|
<type>jar</type>
|
|
|
|
</artifactItem>
|
|
|
|
</artifactItems>
|
|
|
|
<outputDirectory>${project.build.directory}/assembly</outputDirectory>
|
|
|
|
</configuration>
|
|
|
|
</execution>
|
|
|
|
<execution>
|
|
|
|
<id>copy</id>
|
|
|
|
<phase>prepare-package</phase>
|
|
|
|
<goals>
|
|
|
|
<goal>copy-dependencies</goal>
|
|
|
|
</goals>
|
|
|
|
<configuration>
|
Use a conventional delegation model in LaunchedURLClassLoader
When an application is run as an executable archive with nested jars,
the application's own classes need to be able to load classes from
within the nested jars. This means that the application's classes need
to be loaded by the same class loader as is used for the nested jars.
When an application is launched with java -jar the contents of the
jar are on the class path of the app class loader, which is the
parent of the LaunchedURLClassLoader that is used to load classes
from within the nested jars. If the root of the jar includes the
application's classes, they would be loaded by the app class loader
and, therefore, would not be able to load classes from within the
nested jars.
Previously, this problem was resolved by LaunchedURLClassLoader being
created with a copy of all of the app class laoder's URLs and by
using an unconventional delegation model that caused it to skip its
parent (the app class loader) and jump straight to its root class
loader. This ensured that the LaunchedURLClassLoader would load both
the application's own classes and those from within any nested jars.
Unfortunately, this unusual delegation model has proved to be
problematic. We have seen and worked around some problems with Java
Agents (see gh-4911 and gh-863), but there are others (see gh-4868)
that cannot be made to work with the current delegation model.
This commit reworks LaunchedURLClassLoader to use a conventional
delegate model with the app class loader as its parent. With this
change in place, the application's own classes need to be hidden
from the app class loader via some other means. This is now achieved
by packaging application classes in BOOT-INF/classes (and, for
symmetry, nested jars are now packaged in BOOT-INF/lib). Both the
JarLauncher and the PropertiesLauncher (which supports the executable
jar layout) have been updated to look for classes and nested jars in
these new locations.
Closes gh-4897
Fixes gh-4868
9 years ago
|
|
|
<outputDirectory>${project.build.directory}/assembly/BOOT-INF/lib</outputDirectory>
|
|
|
|
<includeScope>runtime</includeScope>
|
|
|
|
</configuration>
|
|
|
|
</execution>
|
|
|
|
</executions>
|
|
|
|
</plugin>
|
|
|
|
<plugin>
|
|
|
|
<groupId>org.apache.maven.plugins</groupId>
|
|
|
|
<artifactId>maven-assembly-plugin</artifactId>
|
|
|
|
<executions>
|
|
|
|
<execution>
|
|
|
|
<id>jar-with-dependencies</id>
|
|
|
|
<phase>package</phase>
|
|
|
|
<goals>
|
|
|
|
<goal>single</goal>
|
|
|
|
</goals>
|
|
|
|
<configuration>
|
|
|
|
<descriptors>
|
|
|
|
<descriptor>src/main/assembly/jar-with-dependencies.xml</descriptor>
|
|
|
|
</descriptors>
|
|
|
|
<archive>
|
|
|
|
<manifest>
|
|
|
|
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
|
|
|
|
<mainClass>org.springframework.boot.loader.JarLauncher</mainClass>
|
|
|
|
</manifest>
|
|
|
|
<manifestEntries>
|
|
|
|
<Start-Class>${start-class}</Start-Class>
|
|
|
|
<Class-Loader>groovy.lang.GroovyClassLoader</Class-Loader>
|
|
|
|
</manifestEntries>
|
|
|
|
</archive>
|
|
|
|
</configuration>
|
|
|
|
</execution>
|
|
|
|
<execution>
|
|
|
|
<id>bin-package</id>
|
|
|
|
<phase>package</phase>
|
|
|
|
<goals>
|
|
|
|
<goal>single</goal>
|
|
|
|
</goals>
|
|
|
|
<configuration>
|
|
|
|
<descriptors>
|
|
|
|
<descriptor>src/main/assembly/bin-package.xml</descriptor>
|
|
|
|
</descriptors>
|
|
|
|
</configuration>
|
|
|
|
</execution>
|
|
|
|
</executions>
|
|
|
|
</plugin>
|
|
|
|
<plugin>
|
|
|
|
<groupId>org.apache.maven.plugins</groupId>
|
|
|
|
<artifactId>maven-antrun-plugin</artifactId>
|
|
|
|
<dependencies>
|
|
|
|
<dependency>
|
|
|
|
<groupId>ant-contrib</groupId>
|
|
|
|
<artifactId>ant-contrib</artifactId>
|
|
|
|
<version>1.0b3</version>
|
|
|
|
<exclusions>
|
|
|
|
<exclusion>
|
|
|
|
<groupId>ant</groupId>
|
|
|
|
<artifactId>ant</artifactId>
|
|
|
|
</exclusion>
|
|
|
|
</exclusions>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.apache.ant</groupId>
|
|
|
|
<artifactId>ant-nodeps</artifactId>
|
|
|
|
<version>1.8.1</version>
|
|
|
|
</dependency>
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.tigris.antelope</groupId>
|
|
|
|
<artifactId>antelopetasks</artifactId>
|
|
|
|
<version>3.2.10</version>
|
|
|
|
</dependency>
|
|
|
|
</dependencies>
|
|
|
|
<executions>
|
|
|
|
<execution>
|
|
|
|
<id>homebrew</id>
|
|
|
|
<phase>package</phase>
|
|
|
|
<goals>
|
|
|
|
<goal>run</goal>
|
|
|
|
</goals>
|
|
|
|
<inherited>false</inherited>
|
|
|
|
<configuration>
|
|
|
|
<target>
|
|
|
|
<taskdef resource="net/sf/antcontrib/antcontrib.properties" />
|
|
|
|
<taskdef name="stringutil" classname="ise.antelope.tasks.StringUtilTask" />
|
|
|
|
<var name="version-type" value="${project.version}" />
|
|
|
|
<propertyregex property="version-type" override="true" input="${version-type}" regexp=".*\.(.*)" replace="\1" />
|
|
|
|
<propertyregex property="version-type" override="true" input="${version-type}" regexp="(M)\d+" replace="MILESTONE" />
|
|
|
|
<propertyregex property="version-type" override="true" input="${version-type}" regexp="(RC)\d+" replace="MILESTONE" />
|
|
|
|
<propertyregex property="version-type" override="true" input="${version-type}" regexp="BUILD-(.*)" replace="SNAPSHOT" />
|
|
|
|
<stringutil string="${version-type}" property="repo">
|
|
|
|
<lowercase />
|
|
|
|
</stringutil>
|
|
|
|
<checksum algorithm="sha-256" file="${project.build.directory}/spring-boot-cli-${project.version}-bin.tar.gz" property="checksum" />
|
|
|
|
<echo message="Customizing homebrew for ${project.version} with checksum ${checksum} in ${repo} repo" />
|
|
|
|
<copy file="${basedir}/src/main/homebrew/springboot.rb" tofile="${project.build.directory}/springboot.rb" overwrite="true">
|
|
|
|
<filterchain>
|
|
|
|
<expandproperties />
|
|
|
|
</filterchain>
|
|
|
|
</copy>
|
|
|
|
<attachartifact file="${project.build.directory}/springboot.rb" classifier="homebrew" type="rb" />
|
|
|
|
</target>
|
|
|
|
</configuration>
|
|
|
|
</execution>
|
|
|
|
</executions>
|
|
|
|
</plugin>
|
|
|
|
<plugin>
|
|
|
|
<groupId>org.codehaus.mojo</groupId>
|
|
|
|
<artifactId>build-helper-maven-plugin</artifactId>
|
|
|
|
<executions>
|
|
|
|
<execution>
|
|
|
|
<id>add-test-source</id>
|
|
|
|
<phase>process-resources</phase>
|
|
|
|
<goals>
|
|
|
|
<goal>add-test-source</goal>
|
|
|
|
</goals>
|
|
|
|
<configuration>
|
|
|
|
<sources>
|
|
|
|
<source>src/it/java</source>
|
|
|
|
</sources>
|
|
|
|
</configuration>
|
|
|
|
</execution>
|
|
|
|
</executions>
|
|
|
|
</plugin>
|
|
|
|
</plugins>
|
|
|
|
<pluginManagement>
|
|
|
|
<plugins>
|
|
|
|
<plugin>
|
|
|
|
<groupId>org.eclipse.m2e</groupId>
|
|
|
|
<artifactId>lifecycle-mapping</artifactId>
|
|
|
|
<version>1.0.0</version>
|
|
|
|
<configuration>
|
|
|
|
<lifecycleMappingMetadata>
|
|
|
|
<pluginExecutions>
|
|
|
|
<pluginExecution>
|
|
|
|
<pluginExecutionFilter>
|
|
|
|
<groupId>
|
|
|
|
org.apache.maven.plugins
|
|
|
|
</groupId>
|
|
|
|
<artifactId>
|
|
|
|
maven-dependency-plugin
|
|
|
|
</artifactId>
|
|
|
|
<versionRange>
|
|
|
|
[1.0.0,)
|
|
|
|
</versionRange>
|
|
|
|
<goals>
|
|
|
|
<goal>unpack</goal>
|
|
|
|
<goal>copy-dependencies</goal>
|
|
|
|
</goals>
|
|
|
|
</pluginExecutionFilter>
|
|
|
|
<action>
|
|
|
|
<ignore />
|
|
|
|
</action>
|
|
|
|
</pluginExecution>
|
|
|
|
</pluginExecutions>
|
|
|
|
</lifecycleMappingMetadata>
|
|
|
|
</configuration>
|
|
|
|
</plugin>
|
|
|
|
</plugins>
|
|
|
|
</pluginManagement>
|
|
|
|
</build>
|
|
|
|
</project>
|