springboot打包目录解析

一、引言

Java开发中我们使用最多的便是spring框架,比如springboot应用。微服务模式下,每个服务都是一个springboot应用,都会被打包成一个可执行jar包。那么我们有多少人尝试去了解过这个可执行jar到底是什么?它的结构是什么样的,我认为大部分人是没有关注过这个的,今天笔者就通过探索的方式,揭开可执行jar的真面目。

二、打包项目

首先使用IDEA随便创建一个spring web项目,打包一下看下target目录
在这里插入图片描述

classes

展开看到如下结构,主要是把我们自己写的.java文件编译成的.class文件和一些配置文件.yaml或者.properties,我们常说的classpath路径,就是这个classes文件下的路径。
在这里插入图片描述

generated-sources

这个一般是用来存放框架或者工具自动生成的一些源码或者文件的地方,比如注解Lombok等。
在这里插入图片描述

generated-test-sources

这个没什么好说的,用来存放生成一些测试代码源或者文件的地方
在这里插入图片描述

maven-archiver

aven-archiver是Maven内部使用的一个组件,它属于org.apache.maven.archiver包,主要职责在于帮助Maven插件(如maven-jar-plugin, maven-war-plugin等)创建和管理归档文件(例如JAR, WAR, EAR等)。它处理诸如设置归档的元数据(如Manifest文件内容)、收集和归档项目资源和编译后的类文件等工作。在这里插入图片描述

maven-status

maven-status是Maven在构建过程中创建的一个临时目录,用于存储构建期间的中间状态信息。这个目录的内容主要是由Maven的maven-build-number-plugin或maven-checkstyle-plugin等插件生成的,特别是那些需要跟踪文件状态的插件。
在这里插入图片描述

surefire-reports

surefire-reports是Maven项目在执行单元测试时生成的测试报告目录
在这里插入图片描述

test-classes

这个就是测试类的生成目录
在这里插入图片描述
以上就是maven打包后的目录解析说明,接下来的这两个单独的文件是重点
在这里插入图片描述

三、可执行jar包

首先看这个.jar.original后缀的文件,
进入target目录下,用360解压缩解压下original文件解压到自己新建的original文件夹下
在这里插入图片描述
使用IDEA查看,看到文件结构如下
在这里插入图片描述
这个文件很小只有7kb,主要是应用的本地资源,并不包含第三方依赖。

再看.jar结尾的文件,这个就是我们打包好的可执行jar包,同样的解压到创建的jarExcutable文件中

在这里插入图片描述
在IDEA中查看结构如下
在这里插入图片描述

使用terminal控制台,输入tree
在这里插入图片描述
这个文件结构相对来说就比较复杂了,解释下关键部分

  • BOOT-INF/classes:存放的是应用编译后的class文件
  • BOOT-INF/lib:这个存放的是我们引用的所有第三方jar包依赖
  • META-INF/:存放应用相关的元信息
  • org/:存放的是springboot相关的class文件

这个和标准的java EE web应用很相似,在java EE web应用中class文件放在WEB-INF/classes下,依赖的jar包就放在WEB-INF/lib下,二者很相似,其实spring很多东西是在java EE web基础上发展而来。

java -jar yourapplicationName.jar命令可以启动我们的jar包,那么为什么能启动呢?打开这个MANIFEST.MF文件内容
在这里插入图片描述
内容如下
在这里插入图片描述

这个JarLauncher就是可执行JAR文件启动器,是由以下插件spring-boot-maven-plugin追加进去的,JarLauncher是专门装载引导类(启动类)的
在这里插入图片描述
pom文件中引入如下依赖(实际开发不需要引入,这里是为了看源码)

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-loader</artifactId>
</dependency>

JarLauncher源码如下

/*
 * Copyright 2012-2023 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.boot.loader.launch;

/**
 * {@link Launcher} for JAR based archives. This launcher assumes that dependency jars are
 * included inside a {@code /BOOT-INF/lib} directory and that application classes are
 * included inside a {@code /BOOT-INF/classes} directory.
 *
 * @author Phillip Webb
 * @author Andy Wilkinson
 * @author Madhura Bhave
 * @author Scott Frederick
 * @since 3.2.0
 */
public class JarLauncher extends ExecutableArchiveLauncher {

	public JarLauncher() throws Exception {
	}

	protected JarLauncher(Archive archive) throws Exception {
		super(archive);
	}

	@Override
	protected boolean isIncludedOnClassPath(Archive.Entry entry) {
		return isLibraryFileOrClassesDirectory(entry);
	}

	@Override
	protected String getEntryPathPrefix() {
		return "BOOT-INF/";
	}

	static boolean isLibraryFileOrClassesDirectory(Archive.Entry entry) {
		String name = entry.name();
		if (entry.isDirectory()) {
			return name.equals("BOOT-INF/classes/");
		}
		return name.startsWith("BOOT-INF/lib/");
	}

	public static void main(String[] args) throws Exception {
		new JarLauncher().launch(args);
	}

}

其中的BOOT-INF/lib/和BOOT-INF/classes/对应我们解压jar包后的相关文件目录,说明JarLauncher 会从中加载文件

  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot本身并不能直接解析.xmind文件,但我们可以使用第三方库来实现这个功能。 首先,我们需要添加相应的依赖到我们的Spring Boot项目中。一个常用的解析.xmind文件Java库是XMind Java SDK。可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.xmind</groupId> <artifactId>xmind-sdk</artifactId> <version>3.7.8</version> </dependency> ``` 然后,在我们的代码中,可以使用XMind Java SDK提供的API来解析.xmind文件。首先需要创建一个XMindWorkbook对象,然后通过它来获取xmind文件中的各个sheet,并遍历每个sheet中的内容。 ```java import org.xmind.core.*; import java.io.*; public class XMindParser { public void parseXMindFile(String filePath) throws IOException, CoreException { // 创建XMindWorkbook对象 InputStream input = new FileInputStream(filePath); IWorkbookBuilder builder = Core.getWorkbookBuilder(); IWorkbook workbook = builder.loadFromStream(input); // 遍历每个sheet for (ISheet sheet : workbook.getSheets()) { // 处理sheet中的内容 System.out.println("Sheet Name: " + sheet.getTitleText()); // 遍历每个topic节点 for (ITopic rootTopic : sheet.getRootTopics()) { processTopic(rootTopic); } } workbook.close(); } private void processTopic(ITopic topic) { // 处理topic节点 System.out.println("Topic Text: " + topic.getTitleText()); // 遍历子节点 for (ITopic childTopic : topic.getAllChildren()) { processTopic(childTopic); } } } ``` 这样,我们就可以使用上述代码来解析.xmind文件了。只需传入.xmind文件路径调用parseXMindFile方法,即可依次输出每个sheet的名称和每个topic的文本内容。 需要注意的是,这只是一个简单的示例,实际解析.xmind文件可能涉及更复杂的数据结构和逻辑处理。可以根据具体的需求进行功能扩展和数据解析。 ### 回答2: Spring Boot本身并不提供解析.xmind文件的功能,但可以借助第三方库来实现。以下是一种可能的实现方式: 1. 导入第三方库:在项目pom.xml文件中添加xmind库的依赖。 ```xml <dependencies> <dependency> <groupId>com.github.MostArtisticCoder</groupId> <artifactId>xmind-parser</artifactId> <version>1.0.0</version> </dependency> </dependencies> ``` 2. 编写解析方法:创建一个解析工具类,其中编写一个解析.xmind文件的方法。 ```java import org.xmind.core.*; import org.xmind.core.io.*; import java.io.*; public class XmindParser { public static void parseXmindFile(String filePath) { IWorkbookBuilder builder = Core.getWorkbookBuilder(); FileInputStream inputStream; try { inputStream = new FileInputStream(filePath); IWorkbook workbook = builder.loadFromStream(inputStream); ITopic rootTopic = workbook.getPrimarySheet().getRootTopic(); // 可以从rootTopic中提取.xmind文件中的内容并进行后续处理 workbook.close(); } catch (IOException | CoreException e) { e.printStackTrace(); } } } ``` 3. 调用解析方法:在Spring Boot项目的某个需要解析.xmind文件的地方,调用解析方法即可。 ```java @RestController public class XmindController { @GetMapping("/parse") public String parseXmind() { String filePath = "path/to/your/xmind/file.xmind"; XmindParser.parseXmindFile(filePath); return "Xmind file parsed successfully!"; } } ``` 这样,当访问`/parse`接口时,程序会解析指定路径下的.xmind文件并进行相应处理。当然,你可能需要根据具体需求来完善解析方法中的代码。 ### 回答3: 使用Spring Boot解析.xmind文件可以通过以下步骤实现: 1. 首先,需要引入相关的依赖。在pom.xml中添加xmind-parser库的依赖项,这个库可以帮助我们解析.xmind文件。例如: ```xml <dependency> <groupId>net.xmind.signin</groupId> <artifactId>xmind-parser-core</artifactId> <version>3.8.0</version> </dependency> ``` 2. 创建一个Spring Boot的Controller类,用于接收上传的.xmind文件,并解析它。在该类中,我们可以编写一个处理POST请求的方法,用于接收.xmind文件的二进制数据。 ```java @RestController @RequestMapping("/xmind") public class XmindController { @PostMapping("/parse") public void parseXmind(@RequestParam("file") MultipartFile file) { // 获取上传的.xmind文件并进行解析 try { IWorkbookBuilder builder = Core.getWorkbookBuilder(); IWorkbook workbook = builder.loadFromFile(file.getInputStream()); // 在这里可以进一步处理解析后的.xmind文件 // ... } catch (Exception e) { // 处理异常情况 e.printStackTrace(); } } } ``` 3. 在上述代码中,我们通过使用xmind-parser库的相关类和方法,将上传的.xmind文件解析为一个IWorkbook对象,然后可以对这个对象进行进一步的操作,如获取主题、添加注释等。 需要注意的是,上述代码中的解析和操作方法只是一个示例,实际情况下可能需要根据具体的需求进行调整和扩展。 最后,我们可以使用Spring Boot的内嵌容器进行部署和运行,如使用嵌入式Tomcat进行处理HTTP请求。可以使用Spring Boot Maven插件将项目打包为可执行的JAR文件,然后在命令行中运行该JAR文件。 以上就是使用Spring Boot解析.xmind文件的大致步骤,具体实现时还会有其他细节需要考虑和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值