赞
踩
目录
Spring Boot Maven plugin 打包应用为 Jar 包
Spring Boot Maven plugin 打包应用为 War 包
1、Java SE 项目通常会用来封装工具类,此时如果要打包(Jar包),建议使用 Maven 更加简单,本文不做描述。
2、Java SE 项目如果使用了 awt、swing,Java FX,则可以用来做GUI程序;否则可以做普通的后台程序,即不需要用户界面的程序。无论哪种都应该导出为可执行 Jar 文件,即类似 exe 程序一样,双击即可运行。
3、可执行 Jar 程序放到任何安装了Java JRE或者JDK电脑上双击都能运行
新建应用
1、classes 表示编译文件输出目录
2、lib 表示存放第三方 jar 包目录
3、config 表示资源配置文件目录
应用编码
1、程序很简单,双击 jar 运行程序时,就会自动写日志,支持用户输入命令行参数,用户输入什么,全部打印到日志文件中。
2、在线源码文件,很简单,一共三个文件:lib/china.rar · 汪少棠/material - Gitee.com
config\system.properties
com.wmx.utils.LogWmxUtils
com.wmx.MainApp
生成可执行文件
1、可以将此可执行 jar 文件 拷贝到任意安装了 Java 环境的电脑上运行,双击或者使用命令 java -jar china.jar 都可以,在程序已经运行的情况下,再次双击运行时,则会新开进程运行。
2、如果是双击运行,在任务管理器中看到的是 "javaw.exe" 进程,如果是 java -jar xxx.jar 命令行运行,则在任务管理器中看到的是 "java.exe" 进程。
新建项目
1、IDEA 新建 Java FX 应用可以参考《IDEA JavaFX 开发入门》,非常简单,此处不再累赘。
生成可执行文件
方法与上面的 Java SE 应用完全一样。
同样直接双击运行或者命令行运行都可以,可以看到窗口,也可以看到任务管理器中的 javaw.exe进程。
同样应用中可以做任意操作,如通信,网络编程,文件上传下载,UDP 监听等等,照样 mian 方法可以接收参数。
1、如果 jar 是窗口桌面程序(GUI),且除了主线程外,没有其它用户线程时,关了窗口,理论上程序也就运行完了。
2、如果 jar 是窗口程序,且除了主线程外,还有其它用户线程时,则关了窗口,任务管理器照样还能看到 javaw.exe 进程,因为还有子线程没有执行完,则只能杀进程结束程序了。
3、如果 jar 本身也不是窗口程序,则可以杀进程结束程序,即可以在任务管理器中手动结束,也可以使用 DOS 命令来杀进程,如下所示:
taskkill /f /t /im javaw.exe
4、如果是 cmd 命令行启动,且持续输出日志,则关闭 cmd 窗口,程序结束运行。
1、如果运行可执行 jar 程序出现如下报错,这通常是因为打包好的 jar 中的 xxxx.jar\META-INF\MANIFEST.MF 文件中没有自动生成程序入口类。
2、打包后的 jar 文件中必须要有 MANIFEST.MF 主清单文件,否则是无法运行的,然后打包后没有,可以自己手动新建,然后加上 Main-Class: 入口类全路径。
- PS D:\wmx_projects\IDEA_workspaces\activitiFirst\out\artifacts\activitiFirst_jar> java -jar .\activitiFirst.jar
- .\activitiFirst.jar中没有主清单属性
- PS D:\wmx_projects\IDEA_workspaces\activitiFirst\out\artifacts\activitiFirst_jar>
1、https://wangmaoxiong.blog.csdn.net/article/details/90168234#IDEA 部署 web 应用为 war 包。
1、对于 Maven 管理的 Java SE 应用,使用上面 "Java SE 应用"的方式进行打包也是可以的,然而还有更简单的方式,推荐方式。
2、Maven 项目推荐使用 spring-boot 的 spring-boot-maven-plugin 插件来进行打包,无论是 war 包还是 jar 包都可以一键打包。Spring boot 应用默认就是此种方式打包。
- <?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <!--1、使自己的 Maven 应用依赖继承 spring-boot-starter-parent-->
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.1.5.RELEASE</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
-
- <groupId>wmx.com</groupId>
- <artifactId>maven-jar</artifactId>
- <version>1.0-SNAPSHOT</version>
-
- <build>
- <!--2、添加 spring boot maven 插件-->
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
-
- </project>

3、为了效果明显新建一个类,代码如下:
- import java.util.Scanner;
- import java.util.logging.Logger;
- public class MainApp {
- private static final Logger logger = Logger.getAnonymousLogger();
- public static void main(String[] args) {
- Scanner scanner = new Scanner(System.in);
- logger.info("程序启动,请输入留言...");
- String line = scanner.nextLine();
- while (!"exit".equals(line)) {
- logger.info("收到您的信息:[" + line + "]");
- logger.info("您可以继续输入,也可以输入 exit 进行退出.");
- line = scanner.nextLine();
- }
- logger.info("感谢您的来访,再见!");
- scanner.close();
- }
- }

4、直接双击 package 或者 install 一键打包即可:
5、神奇的是它不仅可以自动将第三方的依赖全部一并打包,还会自动生成 META-INF/MANIFEST.MF 主清单文件,此例它的内容生成如下:
- Manifest-Version: 1.0
- Implementation-Title: maven-jar
- Implementation-Version: 1.0-SNAPSHOT
- Start-Class: com.wmx.main.MainApp
- Spring-Boot-Classes: BOOT-INF/classes/
- Spring-Boot-Lib: BOOT-INF/lib/
- Build-Jdk-Spec: 1.8
- Spring-Boot-Version: 2.1.5.RELEASE
- Created-By: Maven Archiver 3.4.0
- Main-Class: org.springframework.boot.loader.JarLauncher
6、可以看出它的 Start-Class 就是程序的入口,没有这个入口类,或者没有此主清单文件,则应用无法双击或者命令行运行的。
7、注意:maven 项目在没有使用 spring boot maven 插件的情况,如果直接使用 package 打包或者 install 命令安装,它只会打包项目的自己的源码以及资源文件,对于第三方的内容并不会包含。
1、无论项目是打成 jar 包还是 war包,都可以使用命令行 java -jar xxxx 运行程序,或者直接双击运行程序,而如果是 war 包,则可以像传统方式一样,将其放在外置的 Tomcat 服务器的 webapps 目录下运行。
2、通过命令行行时,实际上是启动了内置的tomcat容器,所以用的是应用的配置文件中的配置,比如端口,直接部署到tomcat之后,内置的tomcat就不会启用,所以相关配置就以安装的tomcat为准,与应用的配置文件就没有关系了。
3、打包方式 war 与 jar 一样,可以直接点击 IDEA Maven 页签中的 package 或者 install 选项,或者在Terminal窗口使用命令行 mvn clean package。
4、打包成功后,就可以将war包放在tomcat下的webapps下,然后运行tomcat,启动项目了,tomcat 会自动解压 war 包,访问的端口是 tomcat 的端口,必须加上解压 war 包的目录名称作为应用名称,比如:http://127.0.0.1:8080/war_server-0.0.1-SNAPSHOT/hello。
不同点1
1、当选择war为打包方式创建项目时,会默认在启动类的同级目录下新建一个ServletInitializer类,否则需要手动创建此文件。
- import org.springframework.boot.builder.SpringApplicationBuilder;
- import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
- /**
- * 自定义类继承 SpringBootServletInitializer,自定义类名字可以自己随便取
- * 作用是应用启动时,会自动执行 configure 方法,从而初始化 Spring Boot的 Servlet
- *
- * @author wangmaoxiong
- */
- public class ServletInitializer extends SpringBootServletInitializer {
- @Override
- protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
- //传入SpringBoot应用的主程序
- return application.sources(WarServerApplication.class);
- }
- }
不同点2
1、pom.xml 文件中的打包方式 packaging 为 war,tomcat 组件的 scope 为 provided,表明 dependency 由 JDK 或者容器提供。
- <?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.6.3</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
- <groupId>com.wmx</groupId>
- <artifactId>war_server</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>war</packaging>
- <name>war_server</name>
- <description>Demo project for Spring Boot</description>
- <properties>
- <java.version>8</java.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
-
- <!--scope=provided 的依赖打包后会放在 lib-provided 目录下,其他依赖会在 lib 目录下 -->
- <!--有外置容器时使用外置容器,没有时自动使用内置容器-->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-tomcat</artifactId>
- <scope>provided</scope>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
-
- </project>

https://gitee.com/wangmx1993/war_server/blob/master/pom.xml
补充说明
1、如果 Spring Boot 应用是使用html作为前端页面开发,则以上两点注意事项满足后就已经可以开发了,但是如果想使用传统的jsp开发,此时还需要一些额外的配置,可以参考《Spring Boot 2.0.3 使用外置 Tomcat 服务器》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。