# Spring Boot 创建一个可以执行的 Jar

**URL:** <https://www.isharkfly.com/t/spring-boot-jar/1111>\
**Category:** 程序语言\
**Tags:** java, spring\
**Created:** [January 12, 2021, 3:44pm UTC](https://www.isharkfly.com/t/spring-boot-jar/1111 "2021-01-12T15:44:17Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [January 12, 2021, 3:44pm UTC](https://www.isharkfly.com/t/spring-boot-jar/1111/1 "2021-01-12T15:44:17Z")

</div>

我们希望将我们上面的程序打包成一个可以执行的 Jar，然后我们可以通过这个 Jar 部署到生产服务器上来运行。 可以执行的 Jar（Executable jars）有时候也会被称为 “fat jars”，这个 jar 中有你所有编译的类和所有运行这些类所需要依赖的 jar。换句话说就是将所有的依赖和你的代码打包成一个可以执行的文件，你可以通过命令行直接运行这个 jar，而不需要将这个 jar 部署到服务器或者容器中。

可执行的 jars 和 Java

Java 并没有给提供一个标准的方案来载入所有需要的 jar 文件（有时候 jar 自己还会包含有其他的 jar）。 当你尝试分发可以自动运行的 jar 的时候，你可能会遇到一些问题，而导致自动运行的 jar 没有办法正常运行和启动。

为了解决这个问题，很多应用开发者使用 “uber” jars。 一个 uber jar 包中包括了所有应用程序运行所需要的类和依赖的类，然后将这些编译后的类打包到一个单独的归档文件中。 使用这种方式来部署你的引用的话，当你尝试通过部署的应用来查看需要的类还引入了那些包 或者 jar 的时候就变得非常困难。 同时，这种方式还有一些潜在的其他问题，比如说在不同的包中有相同名字的类。这种情况将会导致编译无法通过或者有丢失类的问题。

Spring Boot 采用了 其他的方法 同时能够让你能够访问 Jars 的目录。

为了在 Spring Boot 中创建一个可以执行的 jar，我们需要将插件 `spring-boot-maven-plugin` 添加到我们的 `pom.xml` 文件中。 将下面的代码插入到 `dependencies` 部分的后面：

```auto
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

```

 ![spring-boot-1st-execu-01](https://com-ossez-www-discourse.s3.dualstack.us-east-2.amazonaws.com/discourse-uploads/original/2X/4/4a9d65d07d9aa8b9406e9a3b5473b442767e1e76.png)

`spring-boot-starter-parent` POM 包含有 `<executions>` 配置来绑定 `repackage` 的任务。 如果你没有使用 parent POM，你需要自行申明这个配置。 请参考 [插件文档](https://docs.spring.io/spring-boot/docs/2.5.0-SNAPSHOT/maven-plugin/reference/htmlsingle/#getting-started) 来获得更多的详细信息。

保存更新过后的 `pom.xml` 文件，然后从命令行中运行 `mvn package` 命令，你将从命令行中看到下面的输出：

```auto
$ mvn package

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building myproject 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] .... ..
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ myproject ---
[INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.5.0-SNAPSHOT:repackage (default) @ myproject ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

```

如果是第一次构建的话，会下载需要的插件，可能会需要耗费一点点时间。

![spring-boot-1st-execu-02](https://www.isharkfly.com/images/transparent.png)

当构建完成后，访问 `target` 目录，你在这个目录中应该能够找到一个 `myproject-0.0.1-SNAPSHOT.jar` 的文件。 这个文件的大小应该差不多有 10 MB 左右。 如果你想看看这个文件里面有些什么东西的话，你可以通过运行 `jar tvf` 命令来进行查看：

```auto
$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar

```

通过运行上面的命令后，你应该可以在 `target` 目录中看到小文件被命名为 `myproject-0.0.1-SNAPSHOT.jar.original` 。 这些文件就是 Maven 命令创建的。Spring Boot 会将上面创建的这些文件进行重新打包。

![spring-boot-1st-execu-03](https://www.isharkfly.com/images/transparent.png)

你可以通过运行 `java -jar` 命令来运行你的应用程序，输入上面命令后，你的控制台应该会有下面的输出：

```auto
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar

  . _______ _ _
 /\\ / ___'___ _ _(_)_ ____ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/ ___)| |_)| | | | | || (_| | ) ) ) )
  ' | ____| .__ |_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot :: (v2.5.0-SNAPSHOT)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.536 seconds (JVM running for 2.864)

```

![spring-boot-1st-execu-04](https://www.isharkfly.com/images/transparent.png)

与前面使用命令运行的方式一样，你可以通过单击 `ctrl-c` 来退出当前运行的应用。
