Android 10 init启动分析<一>

本文详细剖析了Android设备启动过程,从BootLoader到Linux Kernel,再到Android系统服务。重点介绍了init进程作为Android启动的第一个进程,如何通过解析init.rc脚本来构建系统初始状态,以及后续的SecondStage启动过程。

第一次研究Zygote启动时还是4.0,目前已经Android版本已经发展到了10,变化还是蛮大的,一起来看看吧!

Android设备启动要经过3个阶段,BootLoaderLinux Kernel和Android系统服务,Android系统实际上是运行于Linux内核之上的一系列"服务进程",并不算一个完成意义上的"操作系统";而这一系列进程是维持Android设备正常工作的关键,所以它们肯定有一个"根进程",这个"根进程"衍生出了这一系列进程。这个"根进程"就是init进程。init进程是Android系统启动的第一个进程。它通过解析init.rc脚本来构建出系统的初始形态。其他的"一系列"Android系统进程大部分也是通过"init.rc"来启动的。因为要兼容不同的开发商,所以init.rc脚本的语法很简单,并且采用的是纯文本编辑的,这样导致它可读性就会很高。

     下面我们就来看看这个init进程是如何解析init.rc并根据其语法启动相应的进程的吧!我们要分析init进程,首先要知道init所对应的代码。这里怎么去找呢?我们知道,Android.mk和Android.bp定义了Android源码的编译规则,所以想要找到init所对应的源码还得从他们俩入手。使用命令“ find ./ -name Android.mk -exec  grep -l  init {} \;”就可以找到含有字符串init的所有Android.mk,至于具体是哪一个Android.mk文件,这就需要我们自己打开后自己筛选了!这里我们初步判断是“system/core/init/Android.mk”,这其中就有:

 46 include $(CLEAR_VARS)
 47 LOCAL_CPPFLAGS := $(init_cflags)
 48 LOCAL_SRC_FILES := \
 49     devices.cpp \
 50     first_stage_init.cpp \
 51     first_stage_main.cpp \
 52     first_stage_mount.cpp \
 53     mount_namespace.cpp \
 54     reboot_utils.cpp \
 55     selinux.cpp \
 56     switch_root.cpp \
 57     uevent_listener.cpp \
 58     util.cpp \
 59 
 60 LOCAL_MODULE := init_first_stage
 61 LOCAL_MODULE_STEM := init
 62 
 63 LOCAL_FORCE_STATIC_EXECUTABLE := true
 64 
 65 LOCAL_MODULE_PATH := $(TARGET_RAMDISK_OUT)                                                                                                            
 66 LOCAL_UNSTRIPPED_PATH := $(TARGET_RAMDISK_OUT_UNSTRIPPED)
 67 
 68# Install adb_debug.prop into debug ramdisk.
 69 # This allows adb root on a user build, when debug ramdisk is used.
 70 LOCAL_REQUIRED_MODULES := \
 71    adb_debug.prop \
 72 
 73 # Set up the same mount points on the ramdisk that system-as-root contains.
 74 LOCAL_POST_INSTALL_CMD := mkdir -p \
 75     $(TARGET_RAMDISK_OUT)/apex \
 76     $(TARGET_RAMDISK_OUT)/debug_ramdisk \
 77     $(TARGET_RAMDISK_OUT)/dev \
 78     $(TARGET_RAMDISK_OUT)/mnt \
 79     $(TARGET_RAMDISK_OUT)/proc \
 80     $(TARGET_RAMDISK_OUT)/sys \
 81 
 82 LOCAL_STATIC_LIBRARIES := \
 83     libc++fs \
 84     libfs_avb \
 85     libfs_mgr \
 86     libfec \
 87     libfec_rs \
 88     libsquashfs_utils \
 89     liblogwrap \
 90     libext4_utils \
 91     libfscrypt \
 92     libseccomp_policy \
 93     libcrypto_utils \
 94     libsparse \
 95     libavb \
 96     libkeyutils \
 97     liblp \
 98     libcutils \
 99     libbase \
100     liblog \
101     libcrypto \
102     libdl \                                                                                                                                           
103     libz \
104     libselinux \
105     libcap \
106     libgsi \
107     libcom.android.sysprop.apex \
108     liblzma \
109     libdexfile_support \
110     libunwindstack \
111     libbacktrace \
112 
113 LOCAL_SANITIZE := signed-integer-overflow
114 # First stage init is weird: it may start without stdout/stderr, and no /proc.
115 LOCAL_NOSANITIZE := hwaddress
116 include $(BUILD_EXECUTABLE)   #生成可执行文件

基本都是C++文件,那入口在哪里呢?CPP的入口也是main方法,其中我们猜测是first_stage_main.cpp,打开文件我们看到

17 #include "first_stage_init.h"
18 
19 int main(int argc, char** argv) {
20     return android::init::FirstStageMain(argc, argv);
21 }

果不其然,是我们要找的main,我们就不要客气,直接找“android::init::FirstStageMain(argc, argv);”,这个方法在core/init/first_stage_init.cpp中实现。这个文件的带我我就不贴了,主要是在ramdisk文件系统里创建一个目录并挂载,但是我没有找到加载解析init.rc的地方。

        看到这里,有点懵,怎么刚开始就结束了,好在根据我经验丰富,这里有好多First Stage 字样,是不是还有Second 或者还有Third呢?其实靠谱的做法我猜测和内核启动参数挂载启动文件系统有关(仅猜测,未验证),,但不管怎样,可以找找看!果不其然,还真有Second State。

在“system/core/init/Android.bp”文件中我们发现了

155 cc_binary {
156     name: "init_second_stage",
157     recovery_available: true,
158     stem: "init",
159     defaults: ["init_defaults"],
160     static_libs: ["libinit"],
161     required: [
162         "e2fsdroid",
163         "mke2fs",
164         "sload_f2fs",
165         "make_f2fs",
166     ],
167     srcs: ["main.cpp"],
168     symlinks: ["ueventd"],
169     target: {
170         recovery: {
171             cflags: ["-DRECOVERY"],
172             exclude_shared_libs: ["libbinder", "libutils"],
173         },
174     },
175     ldflags: ["-Wl,--rpath,/system/${LIB}/bootstrap"],
176 }                 

这里就去看看main.cpp

51 int main(int argc, char** argv) {
52 #if __has_feature(address_sanitizer)
53     __asan_set_error_report_callback(AsanReportCallback);
54 #endif
55 
56     if (!strcmp(basename(argv[0]), "ueventd")) {
57         return ueventd_main(argc, argv);
58     }
59 
60     if (argc > 1) {
61         if (!strcmp(argv[1], "subcontext")) {
62             android::base::InitLogging(argv, &android::base::KernelLogger);
63             const BuiltinFunctionMap function_map;
64 
65             return SubcontextMain(argc, argv, &function_map);
66         }
67 
68         if (!strcmp(argv[1], "selinux_setup")) {
69             return SetupSelinux(argv);
70         }
71 
72         if (!strcmp(argv[1], "second_stage")) {                                                                                                        
73             return SecondStageMain(argc, argv);
74         }
75     }
76 
77     return FirstStageMain(argc, argv);
78 }

这里果然有对输入参数的判断,有兴趣的同学可以去研究内核挂载文件系统的参数传递吧,我这里先不看了!

我们看到最后面有 “return SecondStageMain(argc, argv);”,这个应该就是我们要找的二段!

具体实现在system/core/init/init.cpp

这里做了一大堆事情,基本和之前的Android版本没甚区别,大家可以去网上搜一些之前Android版本的看一下。在706行我发现了

“LoadBootScripts(am, sm);” 跟踪发现:

127 static void LoadBootScripts(ActionManager& action_manager, ServiceList& service_list) {
128     Parser parser = CreateParser(action_manager, service_list);
129 
130     std::string bootscript = GetProperty("ro.boot.init_rc", "");                                                                                      
131     if (bootscript.empty()) {
132         parser.ParseConfig("/init.rc");
133         if (!parser.ParseConfig("/system/etc/init")) {
134             late_import_paths.emplace_back("/system/etc/init");
135         }
136         if (!parser.ParseConfig("/product/etc/init")) {
137             late_import_paths.emplace_back("/product/etc/init");
138         }
139         if (!parser.ParseConfig("/product_services/etc/init")) {
140             late_import_paths.emplace_back("/product_services/etc/init");
141         }
142         if (!parser.ParseConfig("/odm/etc/init")) {
143             late_import_paths.emplace_back("/odm/etc/init");
144         }
145         if (!parser.ParseConfig("/vendor/etc/init")) {
146             late_import_paths.emplace_back("/vendor/etc/init");
147         }
148     } else {
149         parser.ParseConfig(bootscript);
150     }
151 }

看到了吧,这里就去解析init.rc了!!!至于怎么解析的,我们后面再讲!

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.12</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.hzxy</groupId> <artifactId>AssistCase_GA</artifactId> <version>0.0.2-SNAPSHOT</version> <name>PublicSecurityAssistCase</name> <!--<packaging>war</packaging>--> <description>Demo project for Spring Boot</description> <!-- <properties>--> <!-- <java.version>1.8</java.version>--> <!-- <hutool.version>5.4.4</hutool.version>--> <!-- </properties>--> <properties> <java.version>17</java.version> <hutool.version>5.4.4</hutool.version> </properties> <dependencies> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-spring-boot-starter-jaxws</artifactId> <version>3.2.5</version> <exclusions> <exclusion> <artifactId>cxf-core</artifactId> <groupId>org.apache.cxf</groupId> </exclusion> <exclusion> <artifactId>spring-boot-autoconfigure</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> <exclusion> <artifactId>spring-boot-starter-web</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> <exclusion> <artifactId>spring-boot</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> </dependency> <dependency> <groupId>com.liferay</groupId> <artifactId>org.apache.commons.configuration</artifactId> <version>1.10.LIFERAY-PATCHED-2</version> </dependency> <!-- axis 1.4 jar start --> <dependency> <groupId>org.apache.axis</groupId> <artifactId>axis</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>commons-discovery</groupId> <artifactId>commons-discovery</artifactId> <version>0.2</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.axis</groupId> <artifactId>axis-jaxrpc</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>org.apache.axis</groupId> <artifactId>axis-saaj</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>wsdl4j</groupId> <artifactId>wsdl4j</artifactId> <version>1.4</version> </dependency> <!-- axis 1.4 jar end --> <!--lib--> <!--<dependency>--> <!--<groupId>org.springframework.boot</groupId>--> <!--<artifactId>spring-boot-starter-tomcat</artifactId>--> <!--<scope>provided</scope>--> <!--</dependency>--> <!--<dependency>--> <!--<groupId>javax.servlet</groupId>--> <!--<artifactId>javax.servlet-api</artifactId>--> <!--<version>3.0.1</version>--> <!--<scope>provided</scope>--> <!--</dependency>--> <dependency> <groupId>com.hzxy.framework</groupId> <artifactId>common</artifactId> <version>0.0.54-SNAPSHOT</version> <exclusions> <exclusion> <artifactId>springfox-swagger-ui</artifactId> <groupId>io.springfox</groupId> </exclusion> <exclusion> <artifactId>spring-boot-starter-web</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> <exclusion> <artifactId>lombok</artifactId> <groupId>org.projectlombok</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.hzxy.framework</groupId> <artifactId>office_nmga</artifactId> <version>0.0.17-SNAPSHOT</version> <exclusions> <exclusion> <artifactId>springfox-swagger-ui</artifactId> <groupId>io.springfox</groupId> </exclusion> <exclusion> <artifactId>spring-boot-starter-web</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> <exclusion> <artifactId>spring-expression</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>lombok</artifactId> <groupId>org.projectlombok</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.hzxy.framework</groupId> <artifactId>multipleStorageTools_GA</artifactId> <version>0.0.5-SNAPSHOT</version> </dependency> <dependency> <groupId>io.dgraph</groupId> <artifactId>dgraph4j</artifactId> <version>20.03.3</version> <exclusions> <exclusion> <artifactId>guava</artifactId> <groupId>com.google.guava</groupId> </exclusion> <exclusion> <artifactId>netty-handler</artifactId> <groupId>io.netty</groupId> </exclusion> <exclusion> <artifactId>netty-common</artifactId> <groupId>io.netty</groupId> </exclusion> <exclusion> <artifactId>grpc-protobuf</artifactId> <groupId>io.grpc</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.org</groupId> <artifactId>dom4j</artifactId> <version>2.1.3</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/dom4j-2.1.3.jar</systemPath> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20170516</version> </dependency> <dependency> <groupId>xom</groupId> <artifactId>xom</artifactId> <version>1.2.5</version> <exclusions> <exclusion> <artifactId>xml-apis</artifactId> <groupId>xml-apis</groupId> </exclusion> <exclusion> <artifactId>xercesImpl</artifactId> <groupId>xerces</groupId> </exclusion> <exclusion> <artifactId>xalan</artifactId> <groupId>xalan</groupId> </exclusion> </exclusions> </dependency> <!-- <dependency> <groupId>com.hzxy</groupId> <artifactId>instantmsg</artifactId> <scope>system</scope> <version>0.0.1-SNAPSHOT</version> <systemPath>${project.basedir}/src/main/resources/lib/instantmsg-0.0.1-SNAPSHOT.jar</systemPath> </dependency> --> <!--Swagger2--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> <exclusions> <exclusion> <groupId>io.swagger</groupId> <artifactId>swagger-models</artifactId> </exclusion> <exclusion> <artifactId>guava</artifactId> <groupId>com.google.guava</groupId> </exclusion> <exclusion> <artifactId>spring-beans</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-models</artifactId> <version>1.5.21</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.10.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.5.15</version> <exclusions> <exclusion> <artifactId>spring-context</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-web</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-webmvc</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> <exclusions> <exclusion> <artifactId>mybatis</artifactId> <groupId>org.mybatis</groupId> </exclusion> <exclusion> <artifactId>spring-boot-autoconfigure</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> <exclusion> <artifactId>spring-beans</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.21</version> <exclusions> <exclusion> <artifactId>spring-boot-autoconfigure</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId> <version>5.1.1</version> <exclusions> <exclusion> <artifactId>guava</artifactId> <groupId>com.google.guava</groupId> </exclusion> <exclusion> <artifactId>netty-handler</artifactId> <groupId>io.netty</groupId> </exclusion> <exclusion> <artifactId>netty-common</artifactId> <groupId>io.netty</groupId> </exclusion> <exclusion> <artifactId>json-path</artifactId> <groupId>com.jayway.jsonpath</groupId> </exclusion> </exclusions> </dependency> <!-- 使用druid连接池需要加dbcp依赖 --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-dbcp</artifactId> <version>10.0.16</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> <exclusions> <exclusion> <artifactId>mybatis-plus</artifactId> <groupId>com.baomidou</groupId> </exclusion> <exclusion> <artifactId>spring-boot-autoconfigure</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency> <!-- mybatis plus 代码生成器依赖 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.4.1</version> </dependency> <!-- 代码生成器模板 --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>2.5.15</version> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> <exclusion> <artifactId>json-path</artifactId> <groupId>com.jayway.jsonpath</groupId> </exclusion> <exclusion> <artifactId>spring-boot-autoconfigure</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> <exclusion> <artifactId>spring-boot</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.6</version> </dependency> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>2.2.0</version> </dependency> <!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib --> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> <exclusions> <exclusion> <artifactId>commons-beanutils</artifactId> <groupId>commons-beanutils</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.54</version> </dependency> <!--<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency>--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> <exclusions> <exclusion> <artifactId>commons-compress</artifactId> <groupId>org.apache.commons</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.7</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.2</version> </dependency> <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.8</version> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.17.23</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> <version>3.2.5.RELEASE</version> <exclusions> <exclusion> <artifactId>netty-handler</artifactId> <groupId>io.netty</groupId> </exclusion> <exclusion> <artifactId>netty-common</artifactId> <groupId>io.netty</groupId> </exclusion> <exclusion> <artifactId>spring-beans</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-expression</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>elasticsearch</artifactId> <groupId>org.elasticsearch</groupId> </exclusion> <exclusion> <artifactId>elasticsearch-core</artifactId> <groupId>org.elasticsearch</groupId> </exclusion> <exclusion> <artifactId>joda-time</artifactId> <groupId>joda-time</groupId> </exclusion> </exclusions> </dependency> <!-- rabbit mq --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> <version>2.5.15</version> <exclusions> <exclusion> <artifactId>spring-amqp</artifactId> <groupId>org.springframework.amqp</groupId> </exclusion> <exclusion> <artifactId>spring-messaging</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>${hutool.version}</version> </dependency> <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</artifactId> <version>1.10.11</version> </dependency> <dependency> <groupId>com.dm</groupId> <artifactId>Dm8JdbcDriver</artifactId> <version>1.7</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/DmJdbcDriver18.jar</systemPath> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.24</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-jexl</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>org.icepdf.os</groupId> <artifactId>icepdf-core</artifactId> <version>6.2.2</version> <exclusions> <exclusion> <groupId>javax.media</groupId> <artifactId>jai_core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-pdfa</artifactId> <version>5.5.13</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency> <!-- pdf样式 --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency> <!--pdf相关操作--> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.10</version> </dependency> <dependency> <groupId>com.drewnoakes</groupId> <artifactId>metadata-extractor</artifactId> <version>2.14.0</version> </dependency> <!-- <dependency>--> <!-- <groupId>org.springframework</groupId>--> <!-- <artifactId>spring-test</artifactId>--> <!-- <version>RELEASE</version>--> <!-- </dependency>--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> <version>2.5.15</version> <exclusions> <exclusion> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> </exclusion> <exclusion> <artifactId>spring-data-elasticsearch</artifactId> <groupId>org.springframework.data</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>x-pack-transport</artifactId> <version>6.8.16</version> </dependency> <dependency> <groupId>uk.com.robust-it</groupId> <artifactId>cloning</artifactId> <version>1.9.12</version> </dependency> <dependency> <groupId>com.aspose.words</groupId> <artifactId>aspose</artifactId> <version>15.8.0.0</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/aspose-words-15.8.0-jdk16.jar</systemPath> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.5.15</version> <exclusions> <exclusion> <artifactId>spring-web</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-webmvc</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot</artifactId> <version>2.5.15</version> <exclusions> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>2.5.15</version> <exclusions> <exclusion> <artifactId>spring-boot</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.2.19.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.2.3.RELEASE</version> <exclusions> <exclusion> <artifactId>spring-beans</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-messaging</artifactId> <version>5.2.22.RELEASE</version> <exclusions> <exclusion> <artifactId>spring-beans</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.2.22.RELEASE</version> <exclusions> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.1.13</version> <exclusions> <exclusion> <artifactId>spring-beans</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-expression</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-web</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>5.3.39</version> <exclusions> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>3.5.3.1</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>1.53.0</version> </dependency> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.5.0</version> <exclusions> <exclusion> <artifactId>spring-boot-autoconfigure</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> <exclusion> <artifactId>spring-webmvc</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>32.0.0-android</version> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.4</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> <version>1.26.0</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <dependency> <groupId>xerces</groupId> <artifactId>xercesImpl</artifactId> <version>2.12.2</version> </dependency> <dependency> <groupId>xalan</groupId> <artifactId>xalan</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-amqp</artifactId> <version>2.2.20.RELEASE</version> <exclusions> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-core</artifactId> <version>3.5.8</version> </dependency> <dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-common</artifactId> <version>4.1.116.Final</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-handler</artifactId> <version>4.1.100.Final</version> <exclusions> <exclusion> <artifactId>netty-common</artifactId> <groupId>io.netty</groupId> </exclusion> </exclusions> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>com.fasterxml.jackson</groupId> <artifactId>jackson-bom</artifactId> <version>2.13.5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <repositories> <!-- add the elasticsearch repo --> <!-- 必须加上 这个仓库,不然x-pack-transport6.8.6在其他仓库中没有--> <repository> <id>elasticsearch-releases</id> <url>https://artifacts.elastic.co/maven</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <distributionManagement> <repository> <id>nexus-releases</id> <name>Local Nexus Repository</name> <url>http://192.168.3.102:8082/repository/maven-releases/</url> </repository> <snapshotRepository> <id>nexus-snapshots</id> <name>Local Nexus Repository</name> <url>http://192.168.3.102:8082/repository/maven-snapshots/</url> </snapshotRepository> </distributionManagement> <build> <plugins> <!--如果是打jar包,则需在build的plugins中添加如下配置--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.5.15</version> <configuration> <!--值为true是指打包时包含scope为system的第三方Jar包--> <includeSystemScope>true</includeSystemScope> </configuration> </plugin> </plugins> <!--<plugins>--> <!--<plugin>--> <!--<groupId>org.springframework.boot</groupId>--> <!--<artifactId>spring-boot-maven-plugin</artifactId>--> <!--</plugin>--> <!--<plugin>--> <!--<groupId>org.apache.maven.plugins</groupId>--> <!--<artifactId>maven-compiler-plugin</artifactId>--> <!--<version>${maven-compiler-plugin.version}</version>--> <!--<configuration>--> <!--<source>1.8</source>--> <!--<target>1.8</target>--> <!--<skip>true</skip>--> <!--<encoding>UTF-8</encoding>--> <!--<compilerArguments>--> <!--<extdirs>${project.basedir}/src/main/resources/lib</extdirs>--> <!--<!–extdirs>lib</extdirs>–>--> <!--</compilerArguments>--> <!--</configuration>--> <!--</plugin>--> <!--<plugin>--> <!--<groupId>org.apache.maven.plugins</groupId>--> <!--<artifactId>maven-war-plugin</artifactId>--> <!--<version>3.1.0</version>--> <!--<configuration>--> <!--<webResources>--> <!--<resource>--> <!--<directory>src/main/resources/lib/</directory>--> <!--<targetPath>WEB-INF/lib/</targetPath>--> <!--<includes>--> <!--<include>**/*.jar</include>--> <!--</includes>--> <!--</resource>--> <!--</webResources>--> <!--<failOnMissingWebXml>false</failOnMissingWebXml>--> <!--</configuration>--> <!--</plugin>--> <!--</plugins>--> </build> </project> 这是我的pom文件,启动报错 Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/core/metrics/ApplicationStartup at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:258) at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:271) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1370) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1359) at com.hzxy.PublicSecurityAssistCase.PublicSecurityAssistCaseApplication.main(PublicSecurityAssistCaseApplication.java:18) Caused by: java.lang.ClassNotFoundException: org.springframework.core.metrics.ApplicationStartup at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) ... 5 more
最新发布
07-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值