Commit 4d6dc90e684e554cb985f0326e154e44644b453b
0 parents
Exists in
master
feat: springboot加载外部jar示例
Showing
17 changed files
with
650 additions
and
0 deletions
Show diff stats
1 | +++ a/.gitignore | |
... | ... | @@ -0,0 +1,25 @@ |
1 | +/target/ | |
2 | +!.mvn/wrapper/maven-wrapper.jar | |
3 | + | |
4 | +### STS ### | |
5 | +.apt_generated | |
6 | +.classpath | |
7 | +.factorypath | |
8 | +.project | |
9 | +.settings | |
10 | +.springBeans | |
11 | +.sts4-cache | |
12 | + | |
13 | +### IntelliJ IDEA ### | |
14 | +.idea | |
15 | +*.iws | |
16 | +*.iml | |
17 | +*.ipr | |
18 | + | |
19 | +### NetBeans ### | |
20 | +/nbproject/private/ | |
21 | +/build/ | |
22 | +/nbbuild/ | |
23 | +/dist/ | |
24 | +/nbdist/ | |
25 | +/.nb-gradle/ | |
0 | 26 | \ No newline at end of file | ... | ... |
No preview for this file type
1 | +++ a/LICENSE | |
... | ... | @@ -0,0 +1,24 @@ |
1 | +This is free and unencumbered software released into the public domain. | |
2 | + | |
3 | +Anyone is free to copy, modify, publish, use, compile, sell, or | |
4 | +distribute this software, either in source code form or as a compiled | |
5 | +binary, for any purpose, commercial or non-commercial, and by any | |
6 | +means. | |
7 | + | |
8 | +In jurisdictions that recognize copyright laws, the author or authors | |
9 | +of this software dedicate any and all copyright interest in the | |
10 | +software to the public domain. We make this dedication for the benefit | |
11 | +of the public at large and to the detriment of our heirs and | |
12 | +successors. We intend this dedication to be an overt act of | |
13 | +relinquishment in perpetuity of all present and future rights to this | |
14 | +software under copyright law. | |
15 | + | |
16 | +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
17 | +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
18 | +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |
19 | +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR | |
20 | +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | |
21 | +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | |
22 | +OTHER DEALINGS IN THE SOFTWARE. | |
23 | + | |
24 | +For more information, please refer to <http://unlicense.org> | ... | ... |
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
1 | +++ a/mvnw | |
... | ... | @@ -0,0 +1,225 @@ |
1 | +#!/bin/sh | |
2 | +# ---------------------------------------------------------------------------- | |
3 | +# Licensed to the Apache Software Foundation (ASF) under one | |
4 | +# or more contributor license agreements. See the NOTICE file | |
5 | +# distributed with this work for additional information | |
6 | +# regarding copyright ownership. The ASF licenses this file | |
7 | +# to you under the Apache License, Version 2.0 (the | |
8 | +# "License"); you may not use this file except in compliance | |
9 | +# with the License. You may obtain a copy of the License at | |
10 | +# | |
11 | +# http://www.apache.org/licenses/LICENSE-2.0 | |
12 | +# | |
13 | +# Unless required by applicable law or agreed to in writing, | |
14 | +# software distributed under the License is distributed on an | |
15 | +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
16 | +# KIND, either express or implied. See the License for the | |
17 | +# specific language governing permissions and limitations | |
18 | +# under the License. | |
19 | +# ---------------------------------------------------------------------------- | |
20 | + | |
21 | +# ---------------------------------------------------------------------------- | |
22 | +# Maven2 Start Up Batch script | |
23 | +# | |
24 | +# Required ENV vars: | |
25 | +# ------------------ | |
26 | +# JAVA_HOME - location of a JDK home dir | |
27 | +# | |
28 | +# Optional ENV vars | |
29 | +# ----------------- | |
30 | +# M2_HOME - location of maven2's installed home dir | |
31 | +# MAVEN_OPTS - parameters passed to the Java VM when running Maven | |
32 | +# e.g. to debug Maven itself, use | |
33 | +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 | |
34 | +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files | |
35 | +# ---------------------------------------------------------------------------- | |
36 | + | |
37 | +if [ -z "$MAVEN_SKIP_RC" ] ; then | |
38 | + | |
39 | + if [ -f /etc/mavenrc ] ; then | |
40 | + . /etc/mavenrc | |
41 | + fi | |
42 | + | |
43 | + if [ -f "$HOME/.mavenrc" ] ; then | |
44 | + . "$HOME/.mavenrc" | |
45 | + fi | |
46 | + | |
47 | +fi | |
48 | + | |
49 | +# OS specific support. $var _must_ be set to either true or false. | |
50 | +cygwin=false; | |
51 | +darwin=false; | |
52 | +mingw=false | |
53 | +case "`uname`" in | |
54 | + CYGWIN*) cygwin=true ;; | |
55 | + MINGW*) mingw=true;; | |
56 | + Darwin*) darwin=true | |
57 | + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home | |
58 | + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html | |
59 | + if [ -z "$JAVA_HOME" ]; then | |
60 | + if [ -x "/usr/libexec/java_home" ]; then | |
61 | + export JAVA_HOME="`/usr/libexec/java_home`" | |
62 | + else | |
63 | + export JAVA_HOME="/Library/Java/Home" | |
64 | + fi | |
65 | + fi | |
66 | + ;; | |
67 | +esac | |
68 | + | |
69 | +if [ -z "$JAVA_HOME" ] ; then | |
70 | + if [ -r /etc/gentoo-release ] ; then | |
71 | + JAVA_HOME=`java-config --jre-home` | |
72 | + fi | |
73 | +fi | |
74 | + | |
75 | +if [ -z "$M2_HOME" ] ; then | |
76 | + ## resolve links - $0 may be a link to maven's home | |
77 | + PRG="$0" | |
78 | + | |
79 | + # need this for relative symlinks | |
80 | + while [ -h "$PRG" ] ; do | |
81 | + ls=`ls -ld "$PRG"` | |
82 | + link=`expr "$ls" : '.*-> \(.*\)$'` | |
83 | + if expr "$link" : '/.*' > /dev/null; then | |
84 | + PRG="$link" | |
85 | + else | |
86 | + PRG="`dirname "$PRG"`/$link" | |
87 | + fi | |
88 | + done | |
89 | + | |
90 | + saveddir=`pwd` | |
91 | + | |
92 | + M2_HOME=`dirname "$PRG"`/.. | |
93 | + | |
94 | + # make it fully qualified | |
95 | + M2_HOME=`cd "$M2_HOME" && pwd` | |
96 | + | |
97 | + cd "$saveddir" | |
98 | + # echo Using m2 at $M2_HOME | |
99 | +fi | |
100 | + | |
101 | +# For Cygwin, ensure paths are in UNIX format before anything is touched | |
102 | +if $cygwin ; then | |
103 | + [ -n "$M2_HOME" ] && | |
104 | + M2_HOME=`cygpath --unix "$M2_HOME"` | |
105 | + [ -n "$JAVA_HOME" ] && | |
106 | + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` | |
107 | + [ -n "$CLASSPATH" ] && | |
108 | + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` | |
109 | +fi | |
110 | + | |
111 | +# For Migwn, ensure paths are in UNIX format before anything is touched | |
112 | +if $mingw ; then | |
113 | + [ -n "$M2_HOME" ] && | |
114 | + M2_HOME="`(cd "$M2_HOME"; pwd)`" | |
115 | + [ -n "$JAVA_HOME" ] && | |
116 | + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" | |
117 | + # TODO classpath? | |
118 | +fi | |
119 | + | |
120 | +if [ -z "$JAVA_HOME" ]; then | |
121 | + javaExecutable="`which javac`" | |
122 | + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then | |
123 | + # readlink(1) is not available as standard on Solaris 10. | |
124 | + readLink=`which readlink` | |
125 | + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then | |
126 | + if $darwin ; then | |
127 | + javaHome="`dirname \"$javaExecutable\"`" | |
128 | + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" | |
129 | + else | |
130 | + javaExecutable="`readlink -f \"$javaExecutable\"`" | |
131 | + fi | |
132 | + javaHome="`dirname \"$javaExecutable\"`" | |
133 | + javaHome=`expr "$javaHome" : '\(.*\)/bin'` | |
134 | + JAVA_HOME="$javaHome" | |
135 | + export JAVA_HOME | |
136 | + fi | |
137 | + fi | |
138 | +fi | |
139 | + | |
140 | +if [ -z "$JAVACMD" ] ; then | |
141 | + if [ -n "$JAVA_HOME" ] ; then | |
142 | + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then | |
143 | + # IBM's JDK on AIX uses strange locations for the executables | |
144 | + JAVACMD="$JAVA_HOME/jre/sh/java" | |
145 | + else | |
146 | + JAVACMD="$JAVA_HOME/bin/java" | |
147 | + fi | |
148 | + else | |
149 | + JAVACMD="`which java`" | |
150 | + fi | |
151 | +fi | |
152 | + | |
153 | +if [ ! -x "$JAVACMD" ] ; then | |
154 | + echo "Error: JAVA_HOME is not defined correctly." >&2 | |
155 | + echo " We cannot execute $JAVACMD" >&2 | |
156 | + exit 1 | |
157 | +fi | |
158 | + | |
159 | +if [ -z "$JAVA_HOME" ] ; then | |
160 | + echo "Warning: JAVA_HOME environment variable is not set." | |
161 | +fi | |
162 | + | |
163 | +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher | |
164 | + | |
165 | +# traverses directory structure from process work directory to filesystem root | |
166 | +# first directory with .mvn subdirectory is considered project base directory | |
167 | +find_maven_basedir() { | |
168 | + | |
169 | + if [ -z "$1" ] | |
170 | + then | |
171 | + echo "Path not specified to find_maven_basedir" | |
172 | + return 1 | |
173 | + fi | |
174 | + | |
175 | + basedir="$1" | |
176 | + wdir="$1" | |
177 | + while [ "$wdir" != '/' ] ; do | |
178 | + if [ -d "$wdir"/.mvn ] ; then | |
179 | + basedir=$wdir | |
180 | + break | |
181 | + fi | |
182 | + # workaround for JBEAP-8937 (on Solaris 10/Sparc) | |
183 | + if [ -d "${wdir}" ]; then | |
184 | + wdir=`cd "$wdir/.."; pwd` | |
185 | + fi | |
186 | + # end of workaround | |
187 | + done | |
188 | + echo "${basedir}" | |
189 | +} | |
190 | + | |
191 | +# concatenates all lines of a file | |
192 | +concat_lines() { | |
193 | + if [ -f "$1" ]; then | |
194 | + echo "$(tr -s '\n' ' ' < "$1")" | |
195 | + fi | |
196 | +} | |
197 | + | |
198 | +BASE_DIR=`find_maven_basedir "$(pwd)"` | |
199 | +if [ -z "$BASE_DIR" ]; then | |
200 | + exit 1; | |
201 | +fi | |
202 | + | |
203 | +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} | |
204 | +echo $MAVEN_PROJECTBASEDIR | |
205 | +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" | |
206 | + | |
207 | +# For Cygwin, switch paths to Windows format before running java | |
208 | +if $cygwin; then | |
209 | + [ -n "$M2_HOME" ] && | |
210 | + M2_HOME=`cygpath --path --windows "$M2_HOME"` | |
211 | + [ -n "$JAVA_HOME" ] && | |
212 | + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` | |
213 | + [ -n "$CLASSPATH" ] && | |
214 | + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` | |
215 | + [ -n "$MAVEN_PROJECTBASEDIR" ] && | |
216 | + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` | |
217 | +fi | |
218 | + | |
219 | +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain | |
220 | + | |
221 | +exec "$JAVACMD" \ | |
222 | + $MAVEN_OPTS \ | |
223 | + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ | |
224 | + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ | |
225 | + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" | ... | ... |
1 | +++ a/mvnw.cmd | |
... | ... | @@ -0,0 +1,143 @@ |
1 | +@REM ---------------------------------------------------------------------------- | |
2 | +@REM Licensed to the Apache Software Foundation (ASF) under one | |
3 | +@REM or more contributor license agreements. See the NOTICE file | |
4 | +@REM distributed with this work for additional information | |
5 | +@REM regarding copyright ownership. The ASF licenses this file | |
6 | +@REM to you under the Apache License, Version 2.0 (the | |
7 | +@REM "License"); you may not use this file except in compliance | |
8 | +@REM with the License. You may obtain a copy of the License at | |
9 | +@REM | |
10 | +@REM http://www.apache.org/licenses/LICENSE-2.0 | |
11 | +@REM | |
12 | +@REM Unless required by applicable law or agreed to in writing, | |
13 | +@REM software distributed under the License is distributed on an | |
14 | +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
15 | +@REM KIND, either express or implied. See the License for the | |
16 | +@REM specific language governing permissions and limitations | |
17 | +@REM under the License. | |
18 | +@REM ---------------------------------------------------------------------------- | |
19 | + | |
20 | +@REM ---------------------------------------------------------------------------- | |
21 | +@REM Maven2 Start Up Batch script | |
22 | +@REM | |
23 | +@REM Required ENV vars: | |
24 | +@REM JAVA_HOME - location of a JDK home dir | |
25 | +@REM | |
26 | +@REM Optional ENV vars | |
27 | +@REM M2_HOME - location of maven2's installed home dir | |
28 | +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands | |
29 | +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending | |
30 | +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven | |
31 | +@REM e.g. to debug Maven itself, use | |
32 | +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 | |
33 | +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files | |
34 | +@REM ---------------------------------------------------------------------------- | |
35 | + | |
36 | +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' | |
37 | +@echo off | |
38 | +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' | |
39 | +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% | |
40 | + | |
41 | +@REM set %HOME% to equivalent of $HOME | |
42 | +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") | |
43 | + | |
44 | +@REM Execute a user defined script before this one | |
45 | +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre | |
46 | +@REM check for pre script, once with legacy .bat ending and once with .cmd ending | |
47 | +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" | |
48 | +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" | |
49 | +:skipRcPre | |
50 | + | |
51 | +@setlocal | |
52 | + | |
53 | +set ERROR_CODE=0 | |
54 | + | |
55 | +@REM To isolate internal variables from possible post scripts, we use another setlocal | |
56 | +@setlocal | |
57 | + | |
58 | +@REM ==== START VALIDATION ==== | |
59 | +if not "%JAVA_HOME%" == "" goto OkJHome | |
60 | + | |
61 | +echo. | |
62 | +echo Error: JAVA_HOME not found in your environment. >&2 | |
63 | +echo Please set the JAVA_HOME variable in your environment to match the >&2 | |
64 | +echo location of your Java installation. >&2 | |
65 | +echo. | |
66 | +goto error | |
67 | + | |
68 | +:OkJHome | |
69 | +if exist "%JAVA_HOME%\bin\java.exe" goto init | |
70 | + | |
71 | +echo. | |
72 | +echo Error: JAVA_HOME is set to an invalid directory. >&2 | |
73 | +echo JAVA_HOME = "%JAVA_HOME%" >&2 | |
74 | +echo Please set the JAVA_HOME variable in your environment to match the >&2 | |
75 | +echo location of your Java installation. >&2 | |
76 | +echo. | |
77 | +goto error | |
78 | + | |
79 | +@REM ==== END VALIDATION ==== | |
80 | + | |
81 | +:init | |
82 | + | |
83 | +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". | |
84 | +@REM Fallback to current working directory if not found. | |
85 | + | |
86 | +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% | |
87 | +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir | |
88 | + | |
89 | +set EXEC_DIR=%CD% | |
90 | +set WDIR=%EXEC_DIR% | |
91 | +:findBaseDir | |
92 | +IF EXIST "%WDIR%"\.mvn goto baseDirFound | |
93 | +cd .. | |
94 | +IF "%WDIR%"=="%CD%" goto baseDirNotFound | |
95 | +set WDIR=%CD% | |
96 | +goto findBaseDir | |
97 | + | |
98 | +:baseDirFound | |
99 | +set MAVEN_PROJECTBASEDIR=%WDIR% | |
100 | +cd "%EXEC_DIR%" | |
101 | +goto endDetectBaseDir | |
102 | + | |
103 | +:baseDirNotFound | |
104 | +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% | |
105 | +cd "%EXEC_DIR%" | |
106 | + | |
107 | +:endDetectBaseDir | |
108 | + | |
109 | +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig | |
110 | + | |
111 | +@setlocal EnableExtensions EnableDelayedExpansion | |
112 | +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a | |
113 | +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% | |
114 | + | |
115 | +:endReadAdditionalConfig | |
116 | + | |
117 | +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" | |
118 | + | |
119 | +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" | |
120 | +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain | |
121 | + | |
122 | +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* | |
123 | +if ERRORLEVEL 1 goto error | |
124 | +goto end | |
125 | + | |
126 | +:error | |
127 | +set ERROR_CODE=1 | |
128 | + | |
129 | +:end | |
130 | +@endlocal & set ERROR_CODE=%ERROR_CODE% | |
131 | + | |
132 | +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost | |
133 | +@REM check for post script, once with legacy .bat ending and once with .cmd ending | |
134 | +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" | |
135 | +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" | |
136 | +:skipRcPost | |
137 | + | |
138 | +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' | |
139 | +if "%MAVEN_BATCH_PAUSE%" == "on" pause | |
140 | + | |
141 | +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% | |
142 | + | |
143 | +exit /B %ERROR_CODE% | ... | ... |
1 | +++ a/pom.xml | |
... | ... | @@ -0,0 +1,66 @@ |
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
3 | + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |
4 | + <modelVersion>4.0.0</modelVersion> | |
5 | + | |
6 | + <groupId>com.example</groupId> | |
7 | + <artifactId>x</artifactId> | |
8 | + <version>0.0.1-SNAPSHOT</version> | |
9 | + <packaging>jar</packaging> | |
10 | + | |
11 | + <name>springboot.propertieslauncher</name> | |
12 | + <description>Demo project for Spring Boot and its usage of PropertiesLauncher</description> | |
13 | + | |
14 | + <parent> | |
15 | + <groupId>org.springframework.boot</groupId> | |
16 | + <artifactId>spring-boot-starter-parent</artifactId> | |
17 | + <version>2.1.4.RELEASE</version> | |
18 | + <relativePath/> <!-- lookup parent from repository --> | |
19 | + </parent> | |
20 | + | |
21 | + <properties> | |
22 | + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | |
23 | + <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> | |
24 | + <java.version>11</java.version> | |
25 | + </properties> | |
26 | + | |
27 | + <dependencies> | |
28 | + <dependency> | |
29 | + <groupId>org.springframework.boot</groupId> | |
30 | + <artifactId>spring-boot-starter</artifactId> | |
31 | + </dependency> | |
32 | + | |
33 | + <dependency> | |
34 | + <!-- this dependency will we provide externally --> | |
35 | + <!-- but keep it provided, so that we can still execute this spring-boot application in an IDE --> | |
36 | + <groupId>com.h2database</groupId> | |
37 | + <artifactId>h2</artifactId> | |
38 | + <version>1.4.197</version> | |
39 | + <scope>provided</scope> | |
40 | + </dependency> | |
41 | + </dependencies> | |
42 | + | |
43 | + <build> | |
44 | + <plugins> | |
45 | + <plugin> | |
46 | + <groupId>org.springframework.boot</groupId> | |
47 | + <artifactId>spring-boot-maven-plugin</artifactId> | |
48 | + <configuration> | |
49 | + <executable>true</executable> | |
50 | + <layout>ZIP</layout> | |
51 | + <!-- do not bundle DB driver --> | |
52 | + <excludeArtifactIds>h2</excludeArtifactIds> | |
53 | + </configuration> | |
54 | + <executions> | |
55 | + <execution> | |
56 | + <goals> | |
57 | + <goal>repackage</goal> | |
58 | + </goals> | |
59 | + </execution> | |
60 | + </executions> | |
61 | + </plugin> | |
62 | + </plugins> | |
63 | + </build> | |
64 | + | |
65 | + | |
66 | +</project> | ... | ... |
1 | +++ a/readme.md | |
... | ... | @@ -0,0 +1,60 @@ |
1 | +Example for a self-executable Spring Boot JAR, which accesses a DB driver (or any other 3rd-party JAR) from a external (non-bundled) directory. | |
2 | + | |
3 | +This may be useful if you are not allowed to bundle the DB driver with your application. | |
4 | + | |
5 | +Tips: | |
6 | +* Use `ZIP` as layout in `spring-boot-maven-plugin` (to generate the `PropertiesLauncher` entry in the `MANIFEST.MF`) | |
7 | +* Set `<executable>true</executable>` to prepend a shell script to the resulting JAR | |
8 | +* See [command line examples](run.sh) for different types of running the JAR using the `loader.path` option | |
9 | + | |
10 | + | |
11 | +## Expected result | |
12 | + | |
13 | +Have a look for the output | |
14 | + | |
15 | +``` | |
16 | +Try to use external driver | |
17 | +-------------> Found driver h2 1.4 | |
18 | +``` | |
19 | +in all variants. The same application is started using different types of loading an external jar. | |
20 | + | |
21 | +``` | |
22 | +-------------------------- | |
23 | +Variant A via java -jar | |
24 | +-------------------------- | |
25 | +... | |
26 | +2019-04-25 22:51:59.934 INFO 26947 --- [ main] com.example.x.Application : Started Application in 6.005 seconds (JVM running for 6.465) | |
27 | +Try to use external driver | |
28 | +-------------> Found driver h2 1.4 | |
29 | + | |
30 | +-------------------------- | |
31 | +Variant B via java -jar | |
32 | +-------------------------- | |
33 | +... | |
34 | +2019-04-25 22:52:06.447 INFO 26948 --- [ main] com.example.x.Application : Started Application in 5.996 seconds (JVM running for 6.456) | |
35 | +Try to use external driver | |
36 | +-------------> Found driver h2 1.4 | |
37 | + | |
38 | +------------------------------------------------------------------------------------------------ | |
39 | +Variant C via self-executable and loader.path-configuration from (default-) loader.properties | |
40 | +------------------------------------------------------------------------------------------------ | |
41 | +... | |
42 | +Try to use external driver | |
43 | +-------------> Found driver h2 1.4 | |
44 | + | |
45 | +-------------------------------------------------------------------------------------------- | |
46 | +Variant D via self-executable and loader.path-configuration from different property file | |
47 | +-------------------------------------------------------------------------------------------- | |
48 | +... | |
49 | +2019-04-25 22:52:19.494 INFO 26979 --- [ main] com.example.x.Application : Started Application in 6.005 seconds (JVM running for 6.453) | |
50 | +Try to use external driver | |
51 | +-------------> Found driver h2 1.4 | |
52 | + | |
53 | +------------------------------------------------------------ | |
54 | +Variant E via self-executable and LOADER_PATH environment | |
55 | +------------------------------------------------------------ | |
56 | +... | |
57 | +2019-04-25 22:52:26.024 INFO 26995 --- [ main] com.example.x.Application : Started Application in 5.967 seconds (JVM running for 6.439) | |
58 | +Try to use external driver | |
59 | +-------------> Found driver h2 1.4 | |
60 | +``` | ... | ... |
1 | +++ a/run.sh | |
... | ... | @@ -0,0 +1,42 @@ |
1 | +mvn clean package -DskipTests | |
2 | + | |
3 | +# https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/executable-jar.html#executable-jar-launching | |
4 | +# The PropertiesLauncher looks in BOOT-INF/lib/ in your application archive by default, but you can add additional locations by setting an environment variable called LOADER_PATH or loader.path in loader.properties (which is a comma-separated list of directories, archives, or directories within archives). | |
5 | + | |
6 | +# https://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html#executable-jar-property-launcher-features | |
7 | + | |
8 | +current=`pwd` | |
9 | + | |
10 | +echo -------------------------- | |
11 | +echo Variant A via "java -jar" | |
12 | +echo -------------------------- | |
13 | +java -Dloader.path=$current/externallibs/ -jar ./target/x-0.0.1-SNAPSHOT.jar | |
14 | + | |
15 | +echo -------------------------- | |
16 | +echo Variant B via "java -jar" | |
17 | +echo -------------------------- | |
18 | +java -Dloader.path=$current/externallibs/h2-1.4.197.jar -jar ./target/x-0.0.1-SNAPSHOT.jar | |
19 | + | |
20 | +echo ------------------------------------------------------------------------------------------------ | |
21 | +echo Variant C via "self-executable and loader.path-configuration from (default-) loader.properties" | |
22 | +echo ------------------------------------------------------------------------------------------------ | |
23 | +echo loader.path=$current/externallibs/h2-1.4.197.jar > ./target/loader.properties | |
24 | +./target/x-0.0.1-SNAPSHOT.jar | |
25 | +rm ./target/loader.properties | |
26 | + | |
27 | +echo -------------------------------------------------------------------------------------------- | |
28 | +echo Variant D via "self-executable and loader.path-configuration from different property file " | |
29 | +echo -------------------------------------------------------------------------------------------- | |
30 | +export LOADER_CONFIG_LOCATION=otherloader.properties | |
31 | +echo loader.path=$current/externallibs/h2-1.4.197.jar > ./target/otherloader.properties | |
32 | +./target/x-0.0.1-SNAPSHOT.jar | |
33 | +unset LOADER_CONFIG_LOCATION | |
34 | +rm ./target/otherloader.properties | |
35 | + | |
36 | +echo ------------------------------------------------------------ | |
37 | +echo Variant E via "self-executable and LOADER_PATH environment" | |
38 | +echo ------------------------------------------------------------ | |
39 | +export LOADER_PATH=$current/externallibs/h2-1.4.197.jar | |
40 | +./target/x-0.0.1-SNAPSHOT.jar | |
41 | + | |
42 | + | ... | ... |
1 | +++ a/springboot加载外部jar.md | |
... | ... | @@ -0,0 +1,29 @@ |
1 | +# 加载外部jar | |
2 | + | |
3 | + | |
4 | +> 作者: 杜云山 | |
5 | + | |
6 | +启动方式1 启动参数 -Dloader.path= | |
7 | + | |
8 | +```tex | |
9 | +启动: java -Dloader.path=d:\GitHub\spring-boot-propertieslauncher-with-external-jar-master\externallibs\ -jar x-0.0.1-SNAPSHOT.jar | |
10 | + | |
11 | +注意: -Dloader.path=的值如果有不对, 启动时直接值忽略了, 没有任何提示. | |
12 | +``` | |
13 | + | |
14 | + | |
15 | + | |
16 | +启动方式2 jar包同级 文件: | |
17 | + | |
18 | +``` | |
19 | +loader.properties | |
20 | + | |
21 | +内容: loader.path=/GitHub/spring-boot-propertieslauncher-with-external-jar-master/externallibs/ | |
22 | + | |
23 | + | |
24 | +也可以手动指定多个jar: 中间用,分隔 | |
25 | +loader.path=/GitHub/spring-boot-propertieslauncher-with-external-jar-master/externallibs/lamta-share-device-client-0.0.1-SNAPSHOT.jar,/GitHub/spring-boot-propertieslauncher-with-external-jar-master/externallibs/devices-aeroflex-0.0.1-SNAPSHOT.jar,/GitHub/spring-boot-propertieslauncher-with-external-jar-master/externallibs/lamta-share-device-core-0.0.1-SNAPSHOT.jar,/GitHub/spring-boot-propertieslauncher-with-external-jar-master/externallibs/mina-core-2.1.4.jar | |
26 | + | |
27 | +启动: java -jar x-0.0.1-SNAPSHOT.jar | |
28 | + | |
29 | +``` | ... | ... |
1 | +++ a/src/main/java/com/example/x/Application.java | |
... | ... | @@ -0,0 +1,35 @@ |
1 | +package com.example.x; | |
2 | + | |
3 | +import org.springframework.boot.CommandLineRunner; | |
4 | +import org.springframework.boot.SpringApplication; | |
5 | +import org.springframework.boot.autoconfigure.SpringBootApplication; | |
6 | +import org.springframework.context.ApplicationContext; | |
7 | +import org.springframework.context.annotation.Bean; | |
8 | + | |
9 | +import java.lang.reflect.Constructor; | |
10 | + | |
11 | +@SpringBootApplication | |
12 | +public class Application | |
13 | +{ | |
14 | + | |
15 | + public static void main(String[] args) | |
16 | + { | |
17 | + SpringApplication.run(Application.class, args); | |
18 | + } | |
19 | + | |
20 | + @Bean | |
21 | + public CommandLineRunner commandLineRunner(ApplicationContext ctx) | |
22 | + { | |
23 | + return args -> | |
24 | + { | |
25 | + System.out.println("Try to use external driver"); | |
26 | + | |
27 | + Class<?> aClass = Class.forName("org.h2.Driver"); | |
28 | + | |
29 | + Constructor c = aClass.getConstructor(); | |
30 | + java.sql.Driver driver = (java.sql.Driver) c.newInstance(); | |
31 | + | |
32 | + System.out.println("-------------> Found driver h2 " + driver.getMajorVersion() + "." +driver.getMinorVersion()); | |
33 | + }; | |
34 | + } | |
35 | +} | ... | ... |
1 | +++ a/src/main/resources/application.properties | ... | ... |