关于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