Springboot 패키지 실행 소스 분석
Springboot을 포장할 때 마븐 플러그인을 설정해야 합니다 [spring-boot-maven-plugin]
org.springframework.boot
spring-boot-maven-plugin
이 플러그인은 다음과 같은 5가지 기능 모듈을 제공합니다.
org.springframework.boot
spring-boot-maven-plugin
executable
구별
Springboot이 친 가방과 Maven이 친 가방의 차이는 어디에 있을까요?maven package에 싸인 가방 a.jar.original의 이름을 a-original로 변경합니다.jar;그리고 Springboot에서 싸운 가방 a.jar와 비교해 보니 Springboot에서 싸운 가방의MANIFEST가 발견됐어요.MF 파일의 행은 다음과 같습니다.
...
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.xxx.XxxApplication
...
이곳의 Start-Class는 바로 우리가 쓴 코드의main 입구류입니다.Main-Class는 Springboot이 우리에게 추가한 시작 클래스입니다.
3. 원본 디버그
Springboot 실행 가능jar의 실행 과정을 이해하려면 가장 좋은 방법은 debug입니다.다음은 먼저 배치해 보겠습니다.
일반적으로jar를 실행하는 명령은java-jarxx입니다.jar debug는 디버그 포트를 열어야 합니다. 명령은 java-agentlib: jdwp=transport=dtsocket,server=y,address=5005,suspend=y -jar xxx.jar
org.springframework.boot
spring-boot-loader
1.5.10.RELEASE
4. 원본 코드 해석
public class JarLauncher extends ExecutableArchiveLauncher {
static final String BOOT_INF_CLASSES = "BOOT-INF/classes/";
static final String BOOT_INF_LIB = "BOOT-INF/lib/";
public JarLauncher() {
}
protected JarLauncher(Archive archive) {
super(archive);
}
@Override
protected boolean isNestedArchive(Archive.Entry entry) {
if (entry.isDirectory()) {
return entry.getName().equals(BOOT_INF_CLASSES);
}
return entry.getName().startsWith(BOOT_INF_LIB);
}
public static void main(String[] args) throws Exception {
new JarLauncher().launch(args);
}
}
public abstract class Launcher {
/**
* 1、 List
* 2、 LaunchedURLClassLoader
* 3、 main class
* 4、
*/
protected void launch(String[] args) throws Exception {
JarFile.registerUrlProtocolHandler();
ClassLoader classLoader = createClassLoader(getClassPathArchives());
launch(args, getMainClass(), classLoader);
}
/**
* classloader
*/
protected ClassLoader createClassLoader(List archives) throws Exception {
List urls = new ArrayList(archives.size());
for (Archive archive : archives) {
urls.add(archive.getUrl());
}
return createClassLoader(urls.toArray(new URL[urls.size()]));
}
/**
* LaunchedURLClassLoader
*/
protected ClassLoader createClassLoader(URL[] urls) throws Exception {
return new LaunchedURLClassLoader(urls, getClass().getClassLoader());
}
/**
* classloader, main class
*/
protected void launch(String[] args, String mainClass, ClassLoader classLoader)
throws Exception {
Thread.currentThread().setContextClassLoader(classLoader);
createMainMethodRunner(mainClass, args, classLoader).run();
}
/**
* MainMethodRunner
*/
protected MainMethodRunner createMainMethodRunner(String mainClass, String[] args, ClassLoader classLoader) {
return new MainMethodRunner(mainClass, args);
}
/**
* , main class
*/
protected abstract String getMainClass() throws Exception;
/**
* , List
*/
protected abstract List getClassPathArchives() throws Exception;
protected final Archive createArchive() throws Exception {
ProtectionDomain protectionDomain = getClass().getProtectionDomain();
CodeSource codeSource = protectionDomain.getCodeSource();
URI location = (codeSource == null ? null : codeSource.getLocation().toURI());
String path = (location == null ? null : location.getSchemeSpecificPart());
if (path == null) {
throw new IllegalStateException("Unable to determine code source archive");
}
File root = new File(path);
if (!root.exists()) {
throw new IllegalStateException(
"Unable to determine code source archive from " + root);
}
return (root.isDirectory() ? new ExplodedArchive(root)
: new JarFileArchive(root));
}
}
public class MainMethodRunner {
private final String mainClassName;
private final String[] args;
public MainMethodRunner(String mainClass, String[] args) {
this.mainClassName = mainClass;
this.args = (args == null ? null : args.clone());
}
/**
* main , invoke
*/
public void run() throws Exception {
Class> mainClass = Thread.currentThread().getContextClassLoader()
.loadClass(this.mainClassName);
Method mainMethod = mainClass.getDeclaredMethod("main", String[].class);
mainMethod.invoke(null, new Object[] { this.args });
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.