关于jar:修改jar中的配置文件

windows下批改关上cmd命令行,输出jar -v命令看是否可用。如果提醒,jar不是外部或外部命令,也不是可运行的程序,则须要进行环境便的配置进入jar包地位,解压原jar包 jar -xvf xxx.jar手动替换配置文件内容从新打包,输出命令 jar -cvf xxx.jar *.*(留神空格) ar 是打jar的命令符;-cvf 是打jar时的参数,写上就能够;xxx.jar 是打成后的jar包名称;. 是指将当前目录所有的文件都打入jar包,也能够输出*.class等。linux下批改cd到jar包地位,而后输出vim xxx.jar,则会显示jar包内的文件列表个别批改之前须要做个备份,应用cp xxx.jar xxx.jar.bak进行备份,避免批改谬误能够回退能够输出/config来搜寻你想要查看的文件,定位到对应的application.properties文件时,按回车键进入配置内查问配置文件内容,批改文件内容,须要把握vim相干的根本命令操作批改实现之后,按esc键,再输出:wq后回车进行保留批改内容这个时候回到的是上一层文件列表目录,如果不想查看或批改文件了,则能够持续退出,这个时候只须要输出:q就能够了,(回到这个目录的时候,很多人会习惯性的进行保留,这个列表目录是不须要保留的,间接退出就能够了)退出到jar文件目录的时候,则批改jar文件的步骤曾经实现,这个时候,咱们个别须要重启你的利用,使你刚刚批改的配置文件失效,如果配置文件是主动加载则不须要重启

April 20, 2023 · 1 min · jiezi

关于jar:从Jar包冲突搞到类加载机制就是这么霸气

接手了一套比拟有年代感的零碎,打算把重构及遇到的问题写成系列文章,老树发新枝,重温一些实战技术,分享给大家。【重构01篇】,给大家讲讲Jar包抵触及原理。 背景目前市面上项目管理要么是基于Maven,要么是基于Gradle,最近接手了一套纯手动增加jar包的我的项目。 对于纯手动增加jar包的我的项目曾经是多年前的形式了,当初工作三五年的技术人员可能都没有经验过。就是把我的项目中所需的jar包挨个找进去,增加到一个lib目录中,在IDE中再将jar包依赖手动增加上。 这种形式来增加jar包依赖,不仅麻烦,而且很容易呈现jar包抵触,同时剖析抵触伎俩,只能凭借教训。 最近就遇到这样一种状况:一个我的项目在开发者A的环境中能够失常启动,在B那里就无奈启动,而异样信息是找不到什么什么类。 略微有一些开发教训的人,马上就能够判定是jar包抵触导致。上面就看看如何解决及引申进去的知识点。 长期解决方案因为临时无奈对我的项目进行大范畴重构,也不敢轻易将Jar包进行替换降级。只能采纳长期的伎俩来进行解决。 这里总结几个步骤以备不时之需,通常也是解决Jar依赖问题的小技巧。 第一:在IDE中查找异样中找不到的类。比方IDEA MAC操作系统,我用的快捷键是command + shift + n。 以Assert类为例,能够看到有很多包都蕴含了Assert,但启动程序却报找不到该类的某个办法,问题基本上就出在Jar包抵触上了。 第二,定位到Jar包抵触之后,找到零碎本应该应用的Jar包。 比方这里须要应用的spring-core中的类,而不spring.jar中的类。那么,就能够利用JVM的类加载程序机制,让JVM先加载spring-core的jar包。 知识点:在同一目录下的jar包,JVM是依照jar包的先后顺序进行加载,一旦一个全路径名雷同的类被加载之后,前面再有雷同的类便不会进行加载了。 因而,长期解决方案就是调整JVM编译(加载)Jar包的程序。这个在Eclipse和Idea中都有反对,能够手动进行调整。 Eclipse中调整形式: Idea中调整形式: 把须要优先加载的jar包往上调整,这样就能够优先加载它,总算是长期解决了jar包抵触的问题。 类加载机制的延长下面只是受限于我的项目现状的长期解决方案,最终必定是要进行革新降级的,基于Maven或Gradle进行Jar包治理,同时解决掉Jar包抵触的问题的。 在这个长期解决方案,波及到一个JVM的要害知识点:JVM的类加载器的隔离问题及双亲委派机制。如果没有JVM类加载机制的相干常识,可能连下面的长期计划都无奈想到。 类加载器的隔离问题每个类装载器都有一个本人的命名空间用来保留已装载的类。当一个类装载器装载一个类时,它会通过保留在命名空间里的类全局限定名(Fully Qualified Class Name) 进行搜寻来检测这个类是否曾经被加载了。 JVM 对类惟一的辨认是 ClassLoader id + PackageName + ClassName,所以一个运行程序中是有可能存在两个包名和类名完全一致的类的。并且如果这两个类不是由一个 ClassLoader 加载,是无奈将一个类的实例强转为另外一个类的,这就是 ClassLoader 隔离性。 为了解决类加载器的隔离问题,JVM引入了双亲委派机制。 双亲委派机制双亲委派机制的外围有两点:第一,自底向上查看类是否已加载;其二,自顶向下尝试加载类。 类加载器通常有四类:启动类加载器、拓展类加载器、应用程序类加载器和自定义类加载器。 暂且不思考自定义类加载器,JDK自带类加载器具体执行过程如下: 第一:当AppClassLoader加载一个class时,会把类加载申请委派给父类加载器ExtClassLoader去实现; 第二:当ExtClassLoader加载一个class时,会把类加载申请委派给BootStrapClassLoader去实现; 第三:如果BootStrapClassLoader加载失败(例如在%JAVA_HOME%/jre/lib里未查找到该class),会应用ExtClassLoader来尝试加载; 第四:如果ExtClassLoader也加载失败,则会应用AppClassLoader来加载,如果AppClassLoader也加载失败,则会报出异样ClassNotFoundException。 ClassLoader的双亲委派实现ClassLoader通过loadClass()办法实现了双亲委托机制,用于类的动静加载。 该办法的源码如下: protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException{ synchronized (getClassLoadingLock(name)) { // First, check if the class has already been loaded Class<?> c = findLoadedClass(name); if (c == null) { long t0 = System.nanoTime(); try { if (parent != null) { c = parent.loadClass(name, false); } else { c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { // ClassNotFoundException thrown if class not found // from the non-null parent class loader } if (c == null) { // If still not found, then invoke findClass in order // to find the class. long t1 = System.nanoTime(); c = findClass(name); // this is the defining class loader; record the stats sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0); sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1); sun.misc.PerfCounter.getFindClasses().increment(); } } if (resolve) { resolveClass(c); } return c; } }loadClass办法自身是一个递归向上调用的过程,上述代码中从parent.loadClass的调用就能够看出。 ...

October 5, 2021 · 1 min · jiezi

Maven项目分析剔除无用jar引用

一、为什么要做这件事?项目持续研发,不停地在上面新增功能,新增特性,引入新的框架和组件,jar包依赖多并且复杂,再加上需求各种变更,有不少已经存在的功能下线,但jar包依赖没人管,还是放在项目的pom.xml文件里。项目持续的时间一长,经常会出现项目打包要求内存多,时间慢的问题,如何分析项目中哪些依赖是有用的,哪些可以剔除的,一方面减轻打包内存占用多,时间慢的问题,另一方面照顾研发童鞋的强迫症问题(容不得半点无用jar包在我的项目里),这事就可以提上日程了。 二、怎么做?如果是Maven项目,执行起来还是比较简单,Maven自己提供了一个检测工具,输入命令即可。在IDEA中,切换到Terminal窗口,或者用命令行打开相应工程目录,直接输入 mvn dependency:analyze查看控制台输出的日志,重点关注这两部分: [WARNING] Used undeclared dependencies found:[WARNING] com.fasterxml.jackson.core:jackson-annotations:jar:2.9.0:compile[WARNING] com.fasterxml.jackson.core:jackson-databind:jar:2.9.9:compile[WARNING] io.jsonwebtoken:jjwt:jar:0.9.0:compile[WARNING] org.apache.rocketmq:rocketmq-common:jar:4.5.2:compile[WARNING] org.springframework:spring-beans:jar:5.1.8.RELEASE:compile[WARNING] com.google.code.gson:gson:jar:2.8.0:compile[WARNING] org.springframework.boot:spring-boot:jar:2.1.6.RELEASE:compile[WARNING] com.fasterxml.jackson.core:jackson-core:jar:2.9.9:compile[WARNING] org.springframework:spring-core:jar:5.1.8.RELEASE:compile[WARNING] org.apache.rocketmq:rocketmq-remoting:jar:4.5.2:compile[WARNING] Unused declared dependencies found:[WARNING] org.projectlombok:lombok:jar:1.16.20:provided[WARNING] org.springframework.boot:spring-boot-starter-test:jar:2.1.6.RELEASE:testUsed undeclared dependencies found间接依赖,就是说你在当前项目工程的pom.xml里没有直接声明,这个依赖是由你声明过的dependency里的pom.xml依赖传递得来的。例如org.apache.rocketmq:rocketmq-common:jar:4.5.2:compile是你引用了这个: <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>4.5.2</version></dependency>Maven本来就是这样用的,也不建议说你把这部分引用拷贝到你的pom.xml里,一般来说这部分的WARNING可以忽略。 Unused declared dependencies found无用依赖,这个指我们在pom.xml声明了这个jar包的依赖,但在项目工程里没有使用到,这个不是我们此次关注的重点,确定不需要,就可以剔除掉这个依赖,Reimport后这个jar包就从我们项目中剔掉了。 三、什么时候做?1)新项目建立时,引用jar包时要慎重,不要一股脑儿直接拷贝老项目的依赖,避免后期又花时间来剔除。2)功能代码重构时,可以适当做一次剔除,因为后面还有自测,提交测试环节,如果有误删,测试的时候能发现。 四、有什么风险要注意的?1)这个检测的结果仅供参考,有时也不准确,如上文提及的org.projectlombok:lombok:jar:1.16.20:provided,实际上在项目中有使用到它的注解@Data,这个属于误判。要注意剔除依赖后多测试,工具毕竟有毕竟的缺陷性。2)如果童鞋们接手遗留的老项目时,这种问题肯定很多,但刚接手时不建议做这个操作,因为本身对项目不熟悉,上来就删东西导致问题会浪费很多时间和精力搞定依赖的问题,这块东西建议暂时先不要动。 五、补充一个小插件查看pom.xml的依赖关系时,可以在IDEA上安装maven help插件,可以直观地看到各jar依赖关系 专注Java高并发、分布式架构,更多技术干货分享与心得,请关注公众号

October 15, 2019 · 1 min · jiezi

springboot通过jar包方式引入bootstrap

一、springboot引入bootstrap的两种方式SpringBoot结合前端有主要有两种方法,一种是在static里面直接加入下载的bootstrap中的css或js;另一种是引入webjars,以jar包的形式加入项目。手动在static中引入bootstrap需要自己去手动下载bootstrap,而引入webjars通过jar包方式就需要配置pom.xml即可。webjars方式引入bootstrap,实际上就是通过webjars方式管理前端静态资源的方式,具体的可以参考:https://www.jianshu.com/p/66d...WebJars官网找到项目所需的依赖,例如在pom.xml引入 jQuery、BootStrap前端组件等。二、webjars方式引入新建一个SpringBoot Web项目。然后在pom文件引入webjars的jar,pom文件代码如下: <dependency> <groupId>org.webjars</groupId> <artifactId>bootstrap</artifactId> <version>3.3.5</version> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>jquery</artifactId> <version>3.1.1</version> </dependency>然后我们观察下项目的依赖包:然后在src/main/resources/static文件下新建index.html,代码如下: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Dalaoyang</title> <link rel="stylesheet" href="/webjars/bootstrap/3.3.5/css/bootstrap.min.css" /> <script src="/webjars/jquery/3.1.1/jquery.min.js"></script> <script src="/webjars/bootstrap/3.3.5/js/bootstrap.min.js"></script></head><body><div class="container"><br/> <div class="alert alert-success"> <a href="#" class="close" data-dismiss="alert" aria-label="close">×</a> <h3>index首页</h3>Hello, <strong>springboot and bootstrap!!!</strong> </div></div></body></html>配置结束,启动项目,访问http://localhost:8888/三、参考链接https://www.cnblogs.com/dalao...[https://www.cnblogs.com/dalao...][7]

June 20, 2019 · 1 min · jiezi

SpringBoot注册Windows服务和启动报错的原因

SpringBoot注册Windows服务和启动报错的原因Windows系统启动Java程序会弹出黑窗口。黑窗口有几点不好。首先它不美观;其次容易误点导致程序关闭;但最让我匪夷所思的是:将鼠标光标选中黑窗口日志信息,程序竟然不会继续执行,日志也不会继续输出。从而导致页面一直处于请求状态。回车后程序才能正常执行。同时客户希望我们能部署在Windows系统上并且做到开机自动启动。针对以上需求将系统程序注册成Windows服务变得尤为重要。针对于SpringBoot程序,目前主流的方法是采用winsw,简单方便。可是在开发过程中,针对不同的系统,启动服务可能会出现意想不到的结果。同样的配置方法,在win10可以成功注册并启动服务。而在windows server 2012 却启动失败。这里分享我的经验。注册windows服务制作流程winsw是⼀款可以将可执⾏程序安装成Windows Service的开源⼩⼯具,官⽹地址, 下载地址制作步骤:第一步:将springboot项目打包成MyServer.jar第二步:将下载的WinSW.NET2.exe 改名为MyServer.exe第三步:将下载的sample-minimal.xml 改名为MyServer.xml第四步:注册和启动服务这里重点介绍 sample-minimal.xml 文件<service> <!– Windows 服务唯一标识ID–> <id>My Server</id> <!– Windows 服务名称–> <name>My Server</name> <!– Windows 服务描述–> <description>This service is a service cratead from a minimal configuration</description> <!– 启动的可执行文件的路径,如果已经配置环境变量,则不必写全路径(则其实是一个坑) –> <executable>java</executable> <arguments> -jar MyServer.jar –spring.datasource.url=jdbc:mysql://localhost:3306/database </arguments> <!– 日志路径,若目录不存在,则默认为配置文件所在的同一目录–> <logpath>ServerPath\log\dashboard&lt;/logpath> <!– 日志模式,默认为append追加模型,rotate为旋转模式–> <logmode>rotate</logmode> </service>executable:启动可执行文件的全路径,如果配置环境变量,则可以简写,所有这里填写Javaarguments:命令执行的参数logpath:配置日志路径logmode:日志输出模式,默认为append,官方文档append (追加模式)其特点是将日志文件全部输出在一个文件中,这个文件可能会越来越大。rotate(旋转模式,推荐)当日志文件大小达到10兆(默认值),winsw会将日志重新输出到另外一份日志文件,最多保留8个(默认值)。reset(重置模式)每次重启服务都会重置日志文件。none(忽略模式)几乎不会生成日志文件。winsw常用命令MyServer.exe install:安装服务MyServer.exe uninstall:删除服务MyServer.exe start:启动服务MyServer.exe stop:停⽌服务MyServer.exe restart:重启服务MyServer.exe status:输出当前服务的状态MyServer.exe 是WinSW.NET2.exe文件。在win10系统上一次成功,没有多余的烦恼。可生活哪有这么容易,在windows server 2012 r2的系统上启动失败。有错误不可怕,可怕的是不会找错误日志。启动windows服务失败服务启动成功后自动关闭,配置的日志文件也没有生成。尝试用cmd执行java -jar的命令,服务可以正常启动。但可具体是什么错误却不得而知。其实Windows服务是有日志管理的。选择:控制面板—管理工具—事件查看器—window日志—应用程序—找出对应服务的日志。如下:Service cannot be started. System.ComponentModel.Win32Exception: The system cannot find the file specified at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo) at winsw.WrapperService.StartProcess(Process processToStart, String arguments, String executable) at winsw.WrapperService.OnStart(String[] _) at System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(Object state)提示很清楚,系统没有找到指定文件,而在winsw的xml文件中就已经配置了executable,并且配置了环境变量。那为什么还提示文件没有找到?抱着试一试的心态,将java改为了全路径。重新注册服务并启动,结果服务启动成功了。一肚子的火不知道往那撒。为了避免这种事情再次发生,决定将executable的内容设置成Java的全路径,于是简单写了一个bat文件。@echo off# 获取java环境变量 set JAVA_HOME=%JAVA_HOME%echo %JAVA_HOME%# 替换java路径setlocal enabledelayedexpansionset file=%cd%\MyServer.xmlset file_tmp=%cd%\MyServer_tmp.xmlset source=JAVAHOMEset replaced=%JAVA_HOME%\bin\javafor /f “delims=” %%i in (%file%) do ( set str=%%i set “str=!str:%source%=%replaced%!” echo !str!>>%file_tmp%)move “%file_tmp%” “%file%”# 注册并启动服务MyServer.exe uninstallMyServer.exe installMyServer.exe startEXIT ...

March 12, 2019 · 1 min · jiezi

在使用spring-boot-maven-plugin的下生成普通的jar包

当使用springboot的maven插件的时候,默认是生成的可执行jar包,如果我们想让其生成普通的jar包该怎么做呢?一、解决办法直接上方法mvn clean package -D spring-boot.repackage.skip=true 加上-Dspring-boot.repackage.skip=true参数即可,此时只会生成一个普通的jar包二、理解当使用SpringBoot开发项目的时候,会使用到spring-boot-maven-plugin插件官方文档:https://docs.spring.io/spring…Spring Boot Maven plugin有5个Goals:命令说明spring-boot:repackage默认goal。在mvn package之后,再次打包可执行的jar/war,<br/>并将mvn package生成的软件包重命名为*.originalspring-boot:run运行Spring Boot应用spring-boot:start在mvn integration-test阶段,进行Spring Boot应用生命周期的管理spring-boot:stop在mvn integration-test阶段,进行Spring Boot应用生命周期的管理spring-boot:build-info生成Actuator使用的构建信息文件build-info.properties当时用spring-boot-maven-plugin插件时,下面的mvn命令会生成两个文件:mvn package执行后会看到生成的两个jar文件:.jar.jar.original这是由于在执行上述命令的过程中,Maven首先在package阶段打包生成*.jar文件;然后执行spring-boot:repackage重新打包,将之前的*.jar包重命名为*.jar.original,然后生成springboot的可执行jar包文件*.jar所以,我们只需要跳过spring-boot:repackage阶段即可。

February 26, 2019 · 1 min · jiezi

Java 开源库精选(持续更新)

仅记录亲自使用和考虑使用的Apache CommonsCommons IO - Commons IO 是一个帮助开发IO功能的实用程序库Commons Configuration - Commons Configuration 提供了一个通用配置界面,使Java应用程序可以从各种来源读取配置数据。查看更多可重用、稳定的 Commons 组件SpringSpring 公共类Spring Web RestTemplate - RestTemplate 是同步客户端执行HTTP请求,在底层HTTP客户端库上公开简单的模板方法API,类使于JDK HttpURLConnection、Feign等社区开源Feign - Feign 使Java编写HTTP客户端更加简单

February 15, 2019 · 1 min · jiezi