java程序打包为jar_将Java应用程序打包为一个(或胖)JAR

java程序打包为jar

这篇文章将针对一个有趣但非常强大的概念:将您的应用程序打包为单个可运行的JAR文件,也称为一个 JAR。

我们习惯了大型WAR归档文件,其中包含所有打包在某些常见文件夹结构下的依赖项。 使用类似于JAR的打包,情况有所不同:为了使您的应用程序可运行(通过java -jar ),所有依赖项都应通过classpath参数或环境变量提供。 通常,这意味着将存在一些具有所有依赖项的lib文件夹和一些可运行的脚本 ,这些脚本将完成构造类路径和运行JVM的工作。 Maven Assembly插件因进行这种应用程序分发而闻名。

稍微不同的方法是将所有应用程序依赖项打包到同一JAR文件中,并使其可运行,而无需任何其他参数或脚本。 听起来不错,但是……除非您添加了一些魔力,否则它将无法正常工作:满足One-JAR项目。

让我们简要概述一下问题:我们正在编写一个独立的Spring应用程序,只需键入java -jar <our-app.jar>即可运行该应用程序。

与往常一样,让我们​​从我们的POM文件开始,这将非常简单

<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.example</groupid><artifactid>spring-one-jar</artifactid><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>spring-one-jar</name><url>http://maven.apache.org</url><properties><project.build.sourceencoding>UTF-8</project.build.sourceencoding><org.springframework.version>3.1.1.RELEASE</org.springframework.version></properties><dependencies><dependency><groupid>cglib</groupid><artifactid>cglib-nodep</artifactid><version>2.2</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-core</artifactid><version>${org.springframework.version}</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-context</artifactid><version>${org.springframework.version}</version></dependency></dependencies>
</project>

我们的示例应用程序将引导Spring上下文,获取一些bean实例并在其上调用一个方法。 我们的bean叫做SimpleBean ,看起来像:

package com.example;
public class SimpleBean {public void print() {System.out.println( 'Called from single JAR!' );}
}

爱上Spring Java配置,让我们将上下文定义为带注释的AppConfig POJO:

package com.example.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import com.example.SimpleBean;@Configuration
public class AppConfig {@Beanpublic SimpleBean simpleBean() {return new SimpleBean();}
}

最后,我们的应用程序Starter具有main()

package com.example;import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;import com.example.config.AppConfig;public class Starter {public static void main( final String[] args ) {ApplicationContext context = new AnnotationConfigApplicationContext( AppConfig.class );SimpleBean bean = context.getBean( SimpleBean.class );bean.print();}
}

将我们的主类添加到META-INF / MANIFEST.MF允许利用Java功能来运行JAR文件,而无需使用main()方法显式指定类。 Maven JAR插件可以帮助我们。

<build><plugins><plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-jar-plugin</artifactid><configuration><archive><manifest><mainclass>com.example.Starter</mainclass></manifest></archive></configuration></plugin></plugins>
</build>

尝试运行java -jar spring-one-jar-0.0.1-SNAPSHOT.jar会将异常输出到控制台: java.lang.NoClassDefFoundError 。 原因很简单:即使是这样一个简单的应用程序,也已经要求以下库位于类路径中。

aopalliance-1.0.jar
cglib-nodep-2.2.jar
commons-logging-1.1.1.jar
spring-aop-3.1.1.RELEASE.jar
spring-asm-3.1.1.RELEASE.jar
spring-beans-3.1.1.RELEASE.jar
spring-context-3.1.1.RELEASE.jar
spring-core-3.1.1.RELEASE.jar
spring-expression-3.1.1.RELEASE.jar

让我们在这里看看One-JAR可以为我们做些什么。 由于onejar-maven-plugin的可用性,我们可以在我们的POM文件的plugins部分中添加一个。

<plugin><groupid>org.dstovall</groupid><artifactid>onejar-maven-plugin</artifactid><version>1.4.4</version><executions><execution><configuration><onejarversion>0.97</onejarversion><classifier>onejar</classifier></configuration><goals><goal>one-jar</goal></goals></execution></executions>
</plugin>

另外, pluginRepositories部分应包含此存储库以便下载插件。

<pluginrepositories><pluginrepository><id>onejar-maven-plugin.googlecode.com</id><url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url></pluginrepository>
</pluginrepositories>

结果, 目标文件夹中将提供另一个工件,后缀有one-jarspring-one-jar-0.0.1-SNAPSHOT.one-jar.jar 。 使用java -jar spring-one-jar-0.0.1-SNAPSHOT.one-jar.jar运行此命令将打印到控制台:

Called from single JAR!

完全可运行的Java应用程序,作为单个可再发行的JAR文件! 最后的评论:尽管我们的应用程序看起来很简单,但是One-JAR也可以完美地用于复杂的大型应用程序。 请把它添加到您的工具箱中,它是非常有用的工具。

感谢One-JAR伙计们!

参考: 简单但功能强大的概念:在Andriy Redko {devmind}博客上,从我们的JCG合作伙伴 Andrey Redko 将Java应用程序打包为一个(或胖)JAR 。

翻译自: https://www.javacodegeeks.com/2012/11/packing-your-java-application-as-one-or-fat-jar.html

java程序打包为jar

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

类定义注意点

1、类成员函数访问修饰const&#xff0c;申明和定义中须保持一致&#xff1b; class IntCell{... ; int read( ) const;...} int IntCell::read( ) const { return storedValue } 转载于:https://www.cnblogs.com/wllwqdeai/p/10691130.html

xshell最多支持4个_中集拉钢卷专用挂车来了!自重5吨,最多能装4个钢卷

【卡车之家 原创】“拉钢卷”在卡车行业里并不是一个好词&#xff0c;和它关联的有送车拉钢卷、断梁、超载、事故等。在钢卷运输领域&#xff0c;超载现象严重&#xff0c;行业很少使用专用车辆运输&#xff0c;因此导致了各类事故频发&#xff0c;最严重的当属去年无锡大桥垮塌…

ubuntu chmod更改权限

权限 chmod 全称 change modifiy - rw- rw- rwx d rw- rw- r— - 第1位是‘-’是文件 第1位是‘d’是文件夹 拥有着权限 用户组权限 其他人权限 rwx 可读可写可执行 rw- 可读可写 r-x 可读不可写可执行 。。。 chmod urwx 1.txt 文件拥有者有rwx权…

优先级反转解决方案

1. 优先级反转(Priority Inversion) 由于多进程共享资源&#xff0c;具有最高优先权的进程被低优先级进程阻塞&#xff0c;反而使具有中优先级的进程先于高优先级的进程执行&#xff0c;导致系统的崩溃。这就是所谓的优先级反转(Priority Inversion)。 2. 产生原因 其…

如何在Java地毯下有效地清除问题

因为软件错误可能使我们在开发人员面前看起来很糟糕&#xff0c;并导致其他人对我们的想法减少&#xff0c;所以最好避免编写错误&#xff0c;快速识别和修复错误或掩盖我们的错误。 有许多博客文章和文章讨论如何避免错误以及如何识别和修复错误&#xff0c;因此&#xff0c;在…

python多线程_python多线程:控制线程数量

背景前段时间学习了python的多线程爬虫&#xff0c;当时爬取一个图片网站&#xff0c;开启多线程后&#xff0c;并没有限制线程的数量&#xff0c;也就是说&#xff0c;如果下载1000张图片&#xff0c;会一次性开启1000个子线程同时进行下载 现在希望控制线程数量&#xff…

ubuntu 添加用户、用户组

添加用户 useradd xxx -m 创建一个xxx的用户 sudo passwd xxx 设置xxx用户的密码 su xxx 切换到xxx用户 su – xxx 切换到xxx用户&#xff0c;且家目录变为xxx家目录 whoami 看用户名 who 查看登录用户 exit …

python实践系列之(一)安装 python/pip/numpy/matplotlib

1.下载并安装Python3.4 在官网下载即可&#xff1a;Python官网 图1-1 图1-2打开Python图形界面&#xff1a; 图1-3 输入 2345&#xff0c;回车&#xff0c;出现如图&#xff0c;说明安装成功。 图1-42.安装pip &#xff08;1&#xff09;查看是否已安装pip 进入cmd命令窗口&…

2019-04(1)(Python学习)

9.1 迭代器 创建迭代器的3种方法&#xff1a; 方法一&#xff1a; 容器对象添加 __iter__() 和 __next__() 方法&#xff08;Python 2.7 中是 next()&#xff09;&#xff1b;__iter__() 返回迭代器对象本身 self&#xff0c;__next__() 则返回每次调用 next() 或迭代时的元素&…

ubuntu 查看进程信息

查看进程信息 ps ps -aux 查看所有进程&#xff0c;每行一个程序 top 显示当前运行程序 kill 98 &#xff08;98为PID号&#xff0c;&#xff09; kill -9 98 &#xff08;强制杀死98&#xff09;

浏览器崩溃_字节跳动程序员28岁身价上亿,财务自由宣布退休;微软最新系统再迎“喜报”:更多用户的浏览器开始崩溃...

新闻1&#xff1a;字节跳动程序员28岁身价上亿&#xff0c;财务自由宣布退休最近字节跳动前员工郭宇火了。原因是他在今年二月份发了一条微博。大概是说他在28岁的年纪实现了财务自由&#xff0c;然后选择了退休。郭宇本来是字节跳动的一名程序员&#xff0c;但现在已经离职去往…

Python图像处理库PIL中图像格式转换(一)

在数字图像处理中&#xff0c;针对不同的图像格式有其特定的处理算法。所以&#xff0c;在做图像处理之前&#xff0c;我们需要考虑清楚自己要基于哪种格式的图像进行算法设计及其实现。本文基于这个需求&#xff0c;使用Python中的图像处理库PIL来实现不同图像格式的转换。 对…

spring 构造函数注入_Spring构造函数注入和参数名称

spring 构造函数注入在运行时&#xff0c;除非在启用了调试选项的情况下编译类&#xff0c;否则Java类不会保留构造函数或方法参数的名称。 这对于Spring构造函数注入有一些有趣的含义。 考虑以下简单的类 package dbg; public class Person {private final String first;pr…

C#基础加强(8)之委托和事件

委托 简介 委托是一种可以声明出指向方法的变量的数据类型。 声明委托的方式 格式&#xff1a; delegate <返回值类型> 委托类型名(参数) &#xff0c;例如&#xff1a; delegate void MyDel(string str) 。 // 注意&#xff1a;这里除了前面的 delegate 关键字&#xff…

模板类的析构函数如何写_顶尖文案如何写?这6大模板、29个方法,奥美大咖都在用!|优惠最后1天...

敲黑板划重点&#xff1a;《顶尖文案训练营》第5期将于2月20日(正月十六)开班&#xff0c;现在报名享受春节特惠8折优惠&#xff0c;今天是优惠最后1天&#xff01;先到先得&#xff0c;速速报名抢位&#xff5e;马上就是2.14情人节了&#xff0c;馒火火在这里提前祝大家情人节…

ubuntu 查看日历,日期

cal 查看当前月日历 cal -y 2008 查看2008年日历 cal -y 2008 > 123.txt 打印到123.txt date 当前日期具体时间 date “%y年%m月%d日”

有效的Java –所有对象通用的方法

所有对象共有的方法&#xff08;第3章&#xff09; 这是Joshua Blochs的《 有效的Java》第3章的简短摘要。我仅包括与自己相关的项目。 一般 等值合约将等价关系描述为&#xff1a; x.equals(null) false 自反 – x.equals(x) true 对称 –如果x.equals(y) true则y.equa…

几种页面置换算法

地址映射过程中&#xff0c;若在页面中发现所要访问的页面不再内存中&#xff0c;则产生缺页中断。当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存&#xff0c;以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。常见的置换算法有&…

win7摄像头怎么开_win7网络连接不可用怎么办

win7网络连接不可用怎么办&#xff1f;网络出现故障最常见的就是网络明明连接上&#xff0c;但是依然提示网络连接不可用&#xff0c;小白系统遇到最常见的就是使用win7系统的用户反馈的&#xff0c;下面让小白系统教你解决win7网络连接不可用的问题吧。首先我们判断网络状态是…

cmake--安装

一&#xff0c; 目录结构 ├── cmake-examples.conf├── CMakeLists.txt├── include│ └── installing│ └── Hello.h└── src ├── Hello.cpp └── main.cpp * link:CMakeLists.txt[] - Contains the CMake commands yo…