IDEA 打包、Spring Boot Maven plugin 打包可执行 Jar、war 程序

目录

IDEA 打包 Java SE 应用为可执行 Jar 包

IDEA 打包 Java FX 应用为可执行 Jar 包

结束 jar 可执行程序

解决 "没有主清单属性" 报错

IDEA 部署 Web 应用为 war 包

Spring Boot Maven plugin 打包应用为 Jar 包

Spring Boot Maven plugin 打包应用为 War 包


IDEA 打包 Java SE 应用为可执行 Jar 包

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" 进程。

IDEA 打包 Java FX 应用为可执行 Jar 包

新建项目

1、IDEA 新建 Java FX 应用可以参考《IDEA JavaFX 开发入门》,非常简单,此处不再累赘。

 生成可执行文件

方法与上面的 Java SE 应用完全一样。

同样直接双击运行或者命令行运行都可以,可以看到窗口,也可以看到任务管理器中的 javaw.exe进程。

同样应用中可以做任意操作,如通信,网络编程,文件上传下载,UDP 监听等等,照样 mian 方法可以接收参数。

结束 jar 可执行程序

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>

IDEA 部署 Web 应用为 war 包

1、https://wangmaoxiong.blog.csdn.net/article/details/90168234#IDEA 部署 web 应用为 war 包

Spring Boot Maven plugin 打包应用为 Jar 包

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 命令安装,它只会打包项目的自己的源码以及资源文件,对于第三方的内容并不会包含。

Spring Boot Maven plugin 打包应用为 War 包

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);
    }
}

https://gitee.com/wangmx1993/war_server/blob/master/src/main/java/com/wmx/war_server/ServletInitializer.java

不同点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 服务器

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
适合初学 springboot 的同学 --------------------------- maven配置:pom.xml --------------------------- <?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> --------------------------- src/main/resources/application.yml --------------------------- spring: # 指定静态资源的路径 resources: static-locations: classpath:/static/,classpath:/views/ thymeleaf: prefix: classpath:/templates/ server: port:8080 context-path:"/" --------------------------- DemoApplication 运行 main 方法即可启动 springboot --------------------------- package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication @ComponentScan(basePackages = {"com.example.*"}) //指定扫描路径 public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } --------------------------- HelloWorldController --------------------------- package com.example.controller; import java.util.HashMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; // @RestController返回的是json @RestController public class HelloWorldController { // http://localhost:8080/hello 返回的是文本"Hello World" @RequestMapping("/hello") public String index() { return "Hello World"; } /** * 本地访问内容地址 :http://localhost:8080/hello3 ;返回的是文本 */ @RequestMapping("/hello3") public String helloHtml(HashMap<String, Object> map) { map.put("hello", "欢迎进入HTML页面"); return "/index"; } } --------------------------- HelloWorldController --------------------------- package com.example.controller; import java.util.HashMap; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class SpringBootController { /** * 本地访问内容地址 :http://localhost:8080/hello2 ; 可访问到 * src/main/resources/views/index.html */ @RequestMapping("/hello2") public String helloHtml(HashMap<String, Object> map) { // 传参数hello到html页面 map.put("hello", "欢迎进入HTML页面"); return "/index"; } } --------------------------- src/main/resources/views/index.html --------------------------- <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> aaaaaaaaaaaaaaaaaaaaaaacccccccccccccc <p th:text="${hello}">dddd</p> </body> </html> --------------------------- 直接访问静态页面 --------------------------- http://localhost:8080/index.html 可直接访问到 src/main/resources/templates/index.html

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蚩尤后裔-汪茂雄

芝兰生于深林,不以无人而不芳。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值