2019独角兽企业重金招聘Python工程师标准>>>

1 简介

大家都知道java项目可以打包成一个可执行的jar包,当我们指定程序的入口main后,可以利用 java -jar YourApp.jar 命令运行可执行jar。那么它需要什么条件才能运行呢?在eclipse java工程和maven工程该怎么打包和部署呢?下面将一一解答。

1.1 运行java -jar app.jar命令的背后

当我们在命令窗口运行java -jar app.jar时,虚拟机做了什么事呢?其实要解答这个问题,就要深入类加载器机制,这已经超出了本文的范围。我们只需要知道,虚拟机使用多个类加载器加载class文件。其中app CLassLoader会获取jar包中的 META-INF/MANIFEST.MF文件,并加载文件中指定的class文件。MANIFEST.MF文件列出了该jar包需要依赖的jar包、可执行jar的入口程序,版本号等。

MANIFEST.MF如下图所示:

至于MANIFEST.MF的格式和如何编写不在本文的范围。

  • ** Manifest-Version ** 清单文件的版本
  • ** Main-Class ** 主程序所在class的全路径
  • ** Class-Path ** 可执行jar依赖的包路径,所指的路径与可执行文件同一目录路径

1.2 需求

** 目的:可执行JAR在控制台输出字符串,主程序中依赖apache的commons-lang3包对字符串进行拼接**

package com.github.thinwonton.jarstarter;import org.apache.commons.lang3.StringUtils;public class JarStarterMain {public static void main(String[] args) {String string = StringUtils.join("JarStarterMain--->", "main"); // 合并字符串System.out.println(string);}
}

最终jar包和第三方jar所在的目录结构

JarStarterJarStarter.jarlibcommons-lang3-3.5.jar

** 运行结果 **

2 eclipse导出可执行jar文件

java工程结构

** 创建自定义MANIFEST.MF文件**

文件内容如下,注意文件最后需要空两行,否则导出jar时,eclipse不会包含Main-Class这行。

Manifest-Version: 1.0
Main-Class: com.github.thinwonton.jarstarter.JarStarterMain
Class-Path: ./lib/commons-lang3-3.5.jar

** 使用eclipse的jar导出功能 **

这时可执行jar已经导出到 f:/JarStarter 文件夹中,我们再把工程所依赖的jar包复制到 f:/JarStarter/lib 文件夹就可用命令jar -jar JarStarter.jar 运行了。

3 maven工程编译可执行jar文件

要编译和打包可执行jar文件,需要借助maven的两个插件:maven-jar-plugin和maven-dependency-plugin。前一个是打包可执行jar文件的,后一个是拷贝依赖包的。下面是它们的具体用法。

pom.xml

<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><groupId>com.github.thinwonton.java</groupId><artifactId>jarstarter-maven</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><dependencies><!-- 工具 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.5</version></dependency></dependencies><build><!-- 输出文件名 --><finalName>jarstarter</finalName><plugins><!-- 资源文件拷贝插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>2.7</version><configuration><encoding>UTF-8</encoding></configuration></plugin><!-- java编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.7</source><target>1.7</target><encoding>UTF-8</encoding></configuration></plugin><!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.6</version><configuration><classesDirectory>target/classes/</classesDirectory><archive><manifest><!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 --><useUniqueVersions>false</useUniqueVersions><!-- 添加Class-Path --><addClasspath>true</addClasspath><!-- Class-Path添加前缀 --><classpathPrefix>lib/</classpathPrefix><!-- 指定Main-Class --><mainClass>com.github.thinwonton.jarstarter.JarStarterMain</mainClass></manifest></archive></configuration></plugin><!-- 拷贝依赖的jar包到lib目录 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>2.10</version><executions><execution><id>copy</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory><!-- 拷贝依赖到lib文件夹 -->${project.build.directory}/lib</outputDirectory></configuration></execution></executions></plugin></plugins></build></project>

在工程根目录下运行 mvn clean package ,这时maven构建工具会在target文件夹中生成 jarstarter.jar 文件 和 lib文件夹,lib文件夹包含有工程所依赖的jar包。 这时jarstarter.jar的清单文件内容:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: Administrator
Class-Path: commons-lang3-3.5.jar
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_102
Main-Class: com.github.thinwonton.jarstarter.JarStarterMain

4 参考资料

本文涉及代码

https://git.oschina.net/thinwonton/java 项目中的jarstarter和jarstarter-maven工程

转载于:https://my.oschina.net/thinwonton/blog/877493

java基础-可执行jar包相关推荐

  1. java jar 可执行_java基础-可执行jar包

    1 简介 大家都知道java项目可以打包成一个可执行的jar包,当我们指定程序的入口main后,可以利用 java -jar YourApp.jar 命令运行可执行jar.那么它需要什么条件才能运行呢 ...

  2. idea 执行 java jar_使用 Intellij Idea 打包 java 工程为可执行 jar 包-Go语言中文社区...

    步骤: 1. 选中Java项目工程名称,在菜单中选择 File->project structure... (快捷键Ctrl+Alt+Shift+S). 2. 在弹出的窗口中左侧选中" ...

  3. 使用 Intellij Idea 打包 java 工程为可执行 jar 包

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 其实还有个简单多了方法,见: 超简单方法: Intellij Idea 把 java 工程打成可运行 ...

  4. Java编程工具(13):idea打包java为可执行jar包

    目录 1.选中Java项目工程名称 2. 在弹出的窗口中左侧选中"Artifacts" 3. 在配置窗口中配置"Main Class" 4.配置"Di ...

  5. android运行jar文件路径,java命令行执行jar包报错解决

    今天遇到一个问题,在终端doc命令行下,执行java -jar 操作,报错Error: Unable to access jarfile CheckAndroidV2Signature.jar 找了各 ...

  6. centos 命令行执行多个命令_命令行如何执行jar包里面的方法

    最近遇到一个尴尬的问题,由于公司机测试环境的机房迁移,导致办公区的网络跟测试环境网络之前延迟比较大,大到什么程度呢?大到不能正常使用测试环境. 由于网络组一直在排查,暂时没有答复,所以只能采取一个比较 ...

  7. java 执行jar包命令

    不依赖外部jar包 执行java -cp xxx.jar xxx.xxxx.xxxx.MainClass 参数一,参数二 依赖外部jar包 当main类依赖多个jar时,可以把多个jar打包到一个目录 ...

  8. java9可执行jar_单个java文件打成可执行jar包

    1 概述 使用JDK自带的jar与java将单个java文件打成可执行jar包并运行. 当然也可以使用IDE完成,使用Maven只需要一个简单的package,但是单个文件嘛,没必要这么"凶 ...

  9. java执行jar中的main_浅谈java 执行jar包中的main方法

    浅谈java 执行jar包中的main方法 通过 OneJar 或 Maven 打包后 jar 文件,用命令: java -jar ****.jar 执行后总是运行指定的主方法,如果 jar 中有多个 ...

最新文章

  1. 浅谈ThreadPool 线程池(引用)
  2. 免费直播 | 特邀大厂产品战略咨询顾问,详解数据驱动产品商业化
  3. 在一个div里,列表样式图片进行float,实现水平排序
  4. configure project qt,如何为Qt Framework配置CLion IDE?
  5. 1112: 进制转换(函数专题)
  6. MongoDB 基础相关(二) 常用语句
  7. HDU 4931 Happy Three Friends(水)
  8. 感谢宝贝: 带给我别样人生
  9. 实验二木马分析(控制分析)实验和实验三冰河木马实验
  10. 2021-07-09 二维码扫码支付开展进程、主要类型及面临的环境政策
  11. Python-Leetcode-剑指offer(五月上做题整理)
  12. pycharm官方下载库很慢、会失败的解决方法
  13. 数字信号处理学习笔记[3] 滤波与褶积,Z变换
  14. nepctf2021
  15. html怎么shell脚本语言,简单shell脚本例子
  16. 360网站卫士php-dos,360doskill.php
  17. AndroidManifest.xml中常用属性及含义
  18. 智能卡CPU卡开卡指令
  19. 一个前端工程师的基本修养
  20. 润乾配置连接kingbase(金仓)数据库

热门文章

  1. 自己写编译器学习总结
  2. Java加密解密入门
  3. layui 动态添加 表格数据
  4. Eclipse之实用快捷键
  5. Hibernate -- Dao层 -- CURD -- 随记
  6. 快学Scala习题解答—第十章 特质
  7. mac上使用zsh配置环境变量
  8. xe7 Unresolved external CSPIN.OBJ
  9. 快速生成解决方案 ctrl + shilf + b
  10. JDK内置工具--jconsole