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 @@ | @@ -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 | \ No newline at end of file | 26 | \ No newline at end of file |
No preview for this file type
1 | +++ a/LICENSE | ||
@@ -0,0 +1,24 @@ | @@ -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 @@ | @@ -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 @@ | @@ -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 @@ | @@ -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 @@ | @@ -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 @@ | @@ -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 @@ | @@ -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 @@ | @@ -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 |