精华内容
下载资源
问答
  • 上篇写了获取jar包中的class文件,在IDEA运行的好好的, 打个包丢服务器上就跑不了了。 原因就是打成jar包之后获取到的class文件路径变成/demo/xxx.jar!/WEB-INF/lib/yyy.jar!/com/demo/zzz.class了,在IDEA中只要...

    问题

    上篇写了获取jar包中的class文件,在IDEA运行的好好的, 打个包丢服务器上就跑不了了。 原因就是打成jar包之后获取到的class文件路径变成/demo/xxx.jar!/WEB-INF/lib/yyy.jar!/com/demo/zzz.class了,在IDEA中只要读取yyy.jar中的class就行,现在要读取xxx.jar包中WEB-INF/lib下yyy.jar中的class文件, 所以今天再来说说获取jar包中的jar包中的class文件。

    分析

    一开始的想法是读取到的文件如果是jar包就再读取这个jar包中的文件,可是发现JarFile和JarEntry中并没有方法能返回jar文件,也不能获取内层文件。Url也不能直接获取两层jar包。

    那么我们打的jar包在服务器使用java -jar启动的时候是这么读取jar包内的文件呢。来解压jar包查看MANIFEST.MF文件:

    Manifest-Version: 1.0
    Implementation-Title: application
    Implementation-Version: 2.0-SNAPSHOT
    Start-Class: com.demo.Application
    Spring-Boot-Classes: BOOT-INF/classes/
    Spring-Boot-Lib: BOOT-INF/lib/
    Build-Jdk-Spec: 1.8
    Spring-Boot-Version: 2.2.4.RELEASE
    Created-By: Maven Archiver 3.4.0
    Implementation-Vendor: Yuanting information technology co.,LTD
    Main-Class: org.springframework.boot.loader.JarLauncher
    

    看这个Main-Class入口类是org.springframework.boot.loader.JarLauncher,执行流程大致如下,有兴趣的可以深入了解一下。

    JarLauncher.main
    创建类加载器 LaunchedURLClassLoader
    加载位置Jar包根目录下BOOT/class BOOT/lib
    class拆解方案 去掉 BOOT/class 前缀直接得到类
    lib拆解方案 提供JarFile--重写了java.util.jar.JarFile
    lib类类文件拆解方案 提供JarEntry--重写了 java.util.jar.JarEntry
    用户class.main

    解决

    复制粘贴工程师就不了解那么多了,直接看解决方案。

    首先添加org.springframework.boot.loader依赖:

    <!-- spring-boot-loader-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-loader</artifactId>
      <version>2.2.4.RELEASE</version>
    </dependency>
    

    精华就在于重写的JarFile,用它读取jar文件就行了:

    public void testJarLaunch() throws IOException, ClassNotFoundException {
            String path = "jar:file:/IdeaProjects/demo-application/target/demo-application-1.0-SNAPSHOT.jar!";
            URL url = new URL(path);
            Handler handler = new Handler();
            org.springframework.boot.loader.jar.JarFile root = handler.getRootJarFileFromUrl(url);
    
            JarFileArchive archive = new JarFileArchive(root);
      		//灵魂方法getNestedArchives获取嵌套的jar等文件,参数是个EntryFilter,过滤条件
            List<Archive> list = archive.getNestedArchives(entry -> {
                System.out.println(entry.getName());
                return entry.getName().endsWith("BOOT-INF/lib/app-core-1.0-SNAPSHOT.jar");
            });
    
      		//list里就是每个jar了
            for (Archive entries : list) {
              	//获取jar里的内容
                Iterator<Archive.Entry> it = entries.iterator();
                while (it.hasNext()){
                    Archive.Entry entry = it.next();
                    String name = entry.getName();
                    System.out.println(name);
                }
            }
    
        }
    

    懒得说了有兴趣的参考这篇:SpringBoot的main函数运行之前都发生了什么

    展开全文
  • jar包中关键字搜索

    2017-02-08 11:23:17
    寻找指定路径下jar包中含特定字符串的文件
  • 主要介绍了Python 如何读取位于包中的数据文件,帮助大家更好的理解和学习Python,感兴趣的朋友可以了解下
  • 3.将jar包中的重写方法所在类的所有代码复制到我们新建的同包名同类名的类中; 4.在我们新建的同包名同类名的类中修改对应的方法中的代码,注意要保持方法中的参数不要发生改变, 也不要删除原类中已有的方法,但是...

    序言

    东西不多,简单明了。

    重写jar的两种方式

    第一种

    重写步骤:

    1.找到你所要重写的方法的所在类,查看其中的路径;

    2.在我们的src目录下新建一个同包名同类名的类;

    3.将jar包中的重写方法所在类的所有代码复制到我们新建的同包名同类名的类中;

    4.在我们新建的同包名同类名的类中修改对应的方法中的代码,注意要保持方法中的参数不要发生改变,
    也不要删除原类中已有的方法,但是可以新增一些方法。

    原理:

    编译输出的时候会优先使用我们src下面的类,而不是优先使用Jar包里面的类,这样就达到了覆盖jar包方法的目的。

    第二种

    在不影响项目目录结构的情况下可以使用这种方式:

    1-4 的步骤与第一种方式的1-4步骤相同。

    5、将同包名同类名的类重写好,将.java文件编译成.class文件。

    6、桌面新建一个文件夹,将编译好的.class文件存进去。

    7、打开jar包所在的文件目录
    在这里插入图片描述
    6、使用压缩软件预览jar包中的class文件
    压缩软件我用的Bandzip
    在这里插入图片描述
    7、将 jar 包中需要替换的类删除(jar中的原文件),把自己编译好的.class文件复制进去。
    XV6aTY2OQ==,size_16,color_FFFFFF,t_70)
    8、替换
    在这里插入图片描述
    9、删除在我们的src目录下新建的包、类。

    展开全文
  • 如何修改jar包中的内容背景:我们的java项目发布后通常会打包成jar包、或者war包,但是有一些配置文件是同jar包打在一起的。如果想要在打包之后修改配置文件,就有点问题了。这里介绍在打包后修改jar包内容的方法ps...

    如何修改jar包中的内容

    背景:

    我们的java项目发布后通常会打包成jar包、或者war包,但是有一些配置文件是同jar包打在一起的。如果想要在打包之后修改配置文件,就有点问题了。这里介绍在打包后修改jar包内容的方法

    ps:

    以下操作接在linux上使用命令行操作,可用其他平台上的同类操作或者图形化工具代替。

    原理:

    jar包其实就是一个压缩的zip包,只不过后缀名是jar。所以可以直接用当成zip解压然后修改后再重新打包成jar。

    解压:

    既然是zip,那么直接就当成是zip来解压,这里使用unzip

    unzip xxx.jar

    然后就可以看到jar包中的文件被解压出来了,其中类的目录按照包名结构存放。

    找到其中我们要修改的文件,例如test.xml

    修改

    这步很简单,修改想要修改的文件,可以用vim、nano之类的。

    打包

    关键的一步来了,我们要将修改后的文件重新打包成jar,这里要使用jdk附带的jar工具。

    jar cvf xxx.jar ./

    就可以重新将修改后的文件重新打包,但是注意此处有个问题,那就是manifest文件的问题,众所周知,manifest文件的记载着一些启动参数,如果是可运行的jar包,那么这个是必不可少的。但是jar命令默认是不会使用原先的manifest文件的,会重新生成一个默认的。所以我们如果想要保留原先的manifest文件必须指定,使用如下的命令制定打包原先的manifest文件。

    jar cvfm xxx.jar ./META-INF/MANIFEST.MF ./

    展开全文
  • app包中的fragment和v4包中的fragment的使用的区别,有需要的朋友可以参考下。 1、尽量不要用app包中的fragment,因为这个是在3.0之后才有的,支持的版本太高,在低版本中是是用不了的。 2、android.support.v4....

    app包中的fragment和v4包中的fragment的使用的区别,有需要的朋友可以参考下。

    1、尽量不要用app包中的fragment,因为这个是在3.0之后才有的,支持的版本太高,在低版本中是是用不了的。

    2、android.support.v4.app.Fragment:可以兼容到1.6的版本。

    3、关于这两个fragment使用标签的问题:
    (1)、app.fragment和v4.fragment都是可以使用<fragment>标签的,只是在使用的时候如果是app.fragment则没有什么特殊的地方,Fragment所在的Activity正常继承Activity类即可。

    (2)、当v4.fragment使用标签的时候就要特别注意了:
    当这个Activity要使用android.support.v4.app.Fragment的时候,这个Activity必须继承FragmentActivity,否则就会报错:

    Caused by: java.lang.ClassCastException: com.example.android_fragment_bottom.fragments.TopBarFragment cannot be cast to android.app.Fragment

    此时如果不继承FragmentActivity的话,编译系统会把android.support.v4.app.Fragment当成app包中的Fragment来处理。但是此时我们导入的是v4包中的Fragment。

    Android官方文档中的Fragment的例子就是以app包中的Fragment来讲解的。

    (3)、app包中关于Fragment的类和方法在V4包中都是有相应的对应的。

    (4)、得到FragmentManager的方法不一样:

            android.app.Fragment:使用getFragmentManager()方法。

    android.support.v4.app.Fragment:使用getSupportFragmentManager()方法。

    转载于:https://my.oschina.net/u/1780920/blog/502732

    展开全文
  • 修改APK包中的某些参数-附件资源
  • xx.rpm包中文件与xxxx.rpm包中的文件有冲突 解决方法: 在spec文件中加入 Obsoletes:old_pkgProvides:old_pkgold_pkg 是需要被替换的包名字 example: 本地已经安装包testA,你编译了一个新的包testB,安装时出现...
  • 主要介绍了Python 分发包中添加额外文件的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
  • Java程序不同包中运行

    2019-10-31 18:29:05
    Java中为什么运行一个程序运行出来却是同一个项目中另外一个包中的程序?
  • 要移除的jar包不在aar包中的classes.jar中 直接把aar包里的Jar打包的时候给去掉,就像下面这这样。注意,要使用exclude module这种方式,直接使用exclude group方式没有效果。exclude group的方法适用于exclude JAR...
  • app包中的fragment和v4包中的fragment的使用的区别1、尽量不要用app包中的fragment,因为这个是在3.0之后才有的,支持的版本太高,在低版本中是是用不了的。2、android.support.v4.app.Fragment:可以兼容到1.6的...
  • java读取jar包中的文件

    2020-07-15 19:11:58
    java读取jar包中的文件 随手写了一个java小工具,maven打包成功后,发现工具总是读不到打在jar包中的文件信息,要读取的文件位于 /src/main/resources 目录下,打包成功后,文件就在jar包中根目录下,一直以为是路径...
  • amaze ui包中缺少jquery文件解决办法-附件资源
  • 主要介绍了Go语言的os包中常用函数初步归纳,用于一些和系统交互功能的实现,需要的朋友可以参考下
  • 修改jar包中文件

    2020-11-12 14:00:32
    问题:修改JAR包中的文件后,直接打包运行 步骤: 1、解压缩jar文件 jar -xf jar文件 2、修改解压后后的文件 3、重新打包 jar -cvfm0 包名.jar META-INF/MANIFEST.MF ./ 注意:解压后重新打包的时候需要...
  • 主要介绍了python查看zip包中文件及大小的方法,实例分析了Python基于zipfile模块操作zip压缩文件的相关技巧,非常简单实用,需要的朋友可以参考下
  • 该楼层疑似违规已被...以下子类和父类在同一个源文件中,如何保存为在同一个包中?class Father{ private int money;int weight;int getWeight(){return weight ;}protected void setWeight(int w){weight=w;}}cl...
  • 下面小编就为大家带来一篇浅谈java 执行jar包中的main方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 主要介绍了解决SpringBoot jar包中的文件读取问题实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 试编程在A包中定义矩形类Rect,类中有求矩形面积的方法,在B包中定义Test类,在该类的main()函数中调用A包中求面积的方法。
  • 可以将ros包中的颜色图和深度图读取出来,并保存到对应文件夹下。 使用时仅需要修改对应话题和路径即可。
  • 解压手机ROM包中的system文件,用于修改手机ROM包。
  • spring覆盖jar包中的实现

    千次阅读 2020-03-26 10:00:59
    spring覆盖jar包中的实现公众号场景描述破局方案 公众号 欢迎大家关注我的公众号,我会定期的给大家分享最前沿的技术、视频教程、黑科技以及开发中遇到的各类疑难杂症的解决方案。 场景描述 最近遇到一个场景,对同...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 444,022
精华内容 177,608
关键字:

包中