精华内容
下载资源
问答
  • 打包jar后找不到路径

    千次阅读 2018-06-29 14:24:41
    但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了。看看下面的代码:Java代码 //源代码1: package edu.hxraid; import java.io.*; public class Resource { public...

      我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等)。在单独运行的时候这些简单的处理当然不会有问题。但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了。看看下面的代码:

    Java代码  收藏代码
    1. //源代码1:  
    2. package edu.hxraid;  
    3. import java.io.*;  
    4. public class Resource {  
    5.     public  void getResource() throws IOException{  
    6.         File file=new File("bin/resource/res.txt");  
    7.         BufferedReader br=new BufferedReader(new FileReader(file));  
    8.         String s="";  
    9.         while((s=br.readLine())!=null)  
    10.             System.out.println(s);  
    11.     }  
    12. }     

            这段代码写在Eclipse建立的java Project中,其目录为:(其中将资源文件res.txt放在了bin目录下,以便打成jar包)
          1、src/
                  src/edu/hxraid/Resource.java
          2、bin/
                  bin/resource/res.txt
                  bin/edu/hxraid/Resource.class

          很显然运行源代码1是能够找到资源文件res.txt。但当我们把整个工程打成jar包以后(ResourceJar.jar),这个jar包内的目录为:
                  edu/hxraid/Resource.class
                  resource/res.txt

     

             而这时jar包中Resource.class字节码:ldc <String "bin/resource/res.txt"> [20] 将无法定位到jar包中的res.txt位置上。就算把bin/目录去掉:ldc <String "resource/res.txt"> [20] 仍然无法定位到jar包中res.txt上。

          这主要是因为jar包是一个单独的文件而非文件夹,绝对不可能通过"file:/e:/.../ResourceJar.jar/resource /res.txt"这种形式的文件URL来定位res.txt。所以即使是相对路径,也无法定位到jar文件内的txt文件(读者也许对这段原因解释有些费解,在下面我们会用一段代码运行的结果来进一步阐述)。

     

              那么把资源打入jar包,无论ResourceJar.jar在系统的什么路径下,jar包中的字节码程序都可以找到该包中的资源。这会是幻想吗?


          当然不是,我们可以用类装载器(ClassLoader)来做到这一点:

             (1) ClassLoader 是类加载器的抽象类。它可以在运行时动态的获取加载类的运行信息。 可以这样说,当我们调用ResourceJar.jar中的Resource类时,JVM加载进Resource类,并记录下Resource运行时信息(包括Resource所在jar包的路径信息)。而ClassLoader类中的方法可以帮助我们动态的获取这些信息:
              ● public URL getResource(String name) 
                查找具有给定名称的资源。资源是可以通过类代码以与代码基无关的方式访问的一些数据(图像、声音、文本等)。并返回资源的URL对象。
              ● public InputStream getResourceAsStream(String name); 
                 返回读取指定资源的输入流。这个方法很重要,可以直接获得jar包中文件的内容。

             

              (2) ClassLoader是abstract的,不可能实例化对象,更加不可能通过ClassLoader调用上面两个方法。所以我们真正写代码的时候,是通过Class类中的getResource()和getResourceAsStream()方法,这两个方法会委托ClassLoader中的getResource()和getResourceAsStream()方法 。好了,现在我们重新写一段Resource代码,来看看上面那段费解的话是什么意思了:

    Java代码  收藏代码
    1. //源代码2:  
    2. package edu.hxraid;  
    3. import java.io.*;  
    4. import java.net.URL;  
    5. public class Resource {  
    6.     public  void getResource() throws IOException{    
    7.               //查找指定资源的URL,其中res.txt仍然开始的bin目录下   
    8.         URL fileURL=this.getClass().getResource("/resource/res.txt");   
    9.         System.out.println(fileURL.getFile());  
    10.     }  
    11.     public static void main(String[] args) throws IOException {  
    12.         Resource res=new Resource();  
    13.         res.getResource();  
    14.     }  
    15. }  

            运行这段源代码结果:/E:/Code_Factory/WANWAN/bin/resource/res.txt  (../ Code_Factory/WANWAN/.. 是java project所在的路径)

               我们将这段代码打包成ResourceJar.jar ,并将ResourceJar.jar放在其他路径下(比如 c:\ResourceJar.jar)。然后另外创建一个java project并导入ResourceJar.jar,写一段调用jar包中Resource类的测试代码:

    Java代码  收藏代码
    1. import java.io.IOException;  
    2. import edu.hxraid.Resource;  
    3. public class TEST {  
    4.     public static void main(String[] args) throws IOException {  
    5.         Resource res=new Resource();  
    6.         res.getResource();  
    7.     }  
    8. }  

               这时的运行结果是:file:/C:/ResourceJar.jar!/resource/res.txt

     

               我们成功的在运行时动态获得了res.txt的位置。然而,问题来了,你是否可以通过下面这样的代码来得到res.txt文件?
                          File f=new File("C:/ResourceJar.jar!/resource/res.txt");
                当然不可能,因为".../ResourceJar.jar!/resource/...."并不是文件资源定位符的格式 (jar中资源有其专门的URL形式:
     jar:<url>!/{entry} )。所以,如果jar包中的类源代码用File f=new File(相对路径);的形式,是不可能定位到文件资源的。这也是为什么源代码1打包成jar文件后,调用jar包时会报出FileNotFoundException的症结所在了。

     

              (3) 我们不能用常规操作文件的方法来读取ResourceJar.jar中的资源文件res.txt,但可以通过Class类的getResourceAsStream()方法来获取 ,这种方法是如何读取jar中的资源文件的,这一点对于我们来说是透明的。我们将Resource.java改写成:

    Java代码  收藏代码
    1. //源代码3:  
    2. package edu.hxraid;  
    3. import java.io.*;  
    4. public class Resource {  
    5.     public void getResource() throws IOException{  
    6.         //返回读取指定资源的输入流  
    7.         InputStream is=this.getClass().getResourceAsStream("/resource/res.txt");   
    8.         BufferedReader br=new BufferedReader(new InputStreamReader(is));  
    9.         String s="";  
    10.         while((s=br.readLine())!=null)  
    11.             System.out.println(s);  
    12.     }  
    13. }  

               我们将java工程下/bin目录中的edu/hxraid/Resource.class和资源文件resource/res.txt一并打包进ResourceJar.jar中,不管jar包在系统的任何目录下,调用jar包中的Resource类都可以获得jar包中的res.txt资源,再也不会找不到res.txt文件了。

    展开全文
  • Class.getResourceAsStream方法,通过这个方法读取项目文件就不会存在打包jar包后读取不到文件的问题 另一种办法就是手动在jar包的同级目录下给他新建对应的文件夹,文件夹按照实际需要的路径来新建和命名,把项目...

    Class.getResourceAsStream方法,通过这个方法读取项目文件就不会存在打包成jar包后读取不到文件的问题

    另一种办法就是手动在jar包的同级目录下给他新建对应的文件夹,文件夹按照实际需要的路径来新建和命名,把项目需要的文件放置到该位置即可

    展开全文
  • 1.将配置文件和其他资源打包jar,仍libs目录下,并在工程中build path 引用 打包命令: jar cvf 名字.jar * //将目录下的所有文件打包jar 2.程序中引用配置文件: InputStream is = this.getClass()....

    解决方法:

    1.将配置文件和其他资源打包成jar,仍到libs目录下,并在工程中build path 引用

    打包命令: jar cvf 名字.jar * //将目录下的所有文件全打包进jar

    2.程序中引用配置文件:

    InputStream is = this.getClass().getResourceAsStream( "ConParam.properties");

    3.jar包目录结构:


    --------------------------------发布jar---------------------------------------------------

    1.eclipse自带发布功能 export

    2.执行jar javaw -jar AAA.jar java -jar AAA.jar 可保存在bat文件里

    3.直接关联jar


    编写bat  javaw -jar %1


    工具---文件夹选项---文件类型---新建jar扩展名----创建关联到编写的bat即可



    展开全文
  • 在Java Project中运行调试时,对工程中的外部文件的访问没有任何问题,但是打包jar后,发现原来的IO访问都提示找不到文件了,这个时候需要注意jar包中访问文件路径问题,应该使用getResourceAsStream()方法来...
    在Java Project中运行调试时,对工程中的外部文件的访问没有任何问题,但是打包成jar后,发现原来的IO访问都提示找不到文件了,这个时候需要注意jar包中访问文件的路径问题,应该使用getResourceAsStream()方法来访问文件。

    举例:

    public class ReaderFile
    {
    private static String txtFile = "test.txt";

    public static final String READ_FILE_ENCODING = "UTF-8";

    public static String readFileContent() throws IOException
    {
    InputStream inStream = ReaderFile.class.getResourceAsStream(txtFile);
    BufferedReader reader = new BufferedReader(new InputStreamReader(inStream, READ_FILE_ENCODING));
    StringBuilder content = new StringBuilder();
    String line = null;
    while (null != (line = reader.readLine()))
    {
    content.append(line);
    }
    reader.close();
    inStream.close();
    return (content.toString());
    }

    public static void main(String[] args) throws IOException
    {
    String content = readFileContent();
    System.out.println(content);
    }
    }


    此时的test.txt与ReaderFile.java在同一目录下,其他情况可自行修改路径
    展开全文
  • 在Maven工程SpringBoot项目中,需要引用外部的一个jar包,在网上看的很多方式都不行:打包是可以成功,但是部署服务器中运行,使用该jar没反应,程序进行下去,我猜测应该是这个jar没有打进去。 最后找到了这...
  • 如果在pom中配置build的资源路径,那么你的资源文件名必须默认是“resources”! 解决办法有两个: 1、修改文件夹名称 2、添加pom的build配置信息(标蓝的部分) 通过maven的maven-archetype-quickstart,...
  • 在idea中正常运行,但是打包jar包却报错,提示找不到文件。说来惭愧,这个问题搞了一上午(虽说有其他问题干扰)但是也觉得尴尬。。。遂记录之 原因分析 初始使用的是getFile(),由于打包成jar。这个绝对路径...
  • )得到项目根目录后再找到相应资源文件,但将改工程打包jar包后,运行该jar时,显示找不到资源文件的错误。 如何解决? 方式一:使用Class.getResource String s1 = this.getClass().getResource("/librar....
  • spring boot 在idea下、或打包成war包运行,获取项目路径下的文件,无异常,打包jar包后,获取项目下文件,报找不到文件的异常,原来打成jar包后,需要以流的形式获取jar包里面的文件,改成以上代码...
  • 解决springboot打成jar包找不到模板的问题 首先确认,我们的情况是否一样? idea里运行一切正常,打成jar包,无法找到模板 首先看你的controller里是不是路径不正确 比如return “/page/home” 这样改成"page/home" ...
  • 项目需要做测试,将项目打成jar包后运行,下载模板文件失败,后台查看错误原因,与打包前在开发工具中运行打印出的资源路径不同,随后去网上查询,大致意思是jar包中能正常的使用文件路径,需要使用流的形式去...
  • 我们都知道,本地测试是完全没用问题的,路径直接是src/**,本地测试完全可以找到。但是打成jar之后,就不再有这个src目录了,而是在classes目录下。可是在服务器也得获取这些证书咋办呢? 我尝试过很多种方法: 1...
  • eclipse中java工程打包jar无法找到src资源文件路径的解决办法 在使用eclipse编写的java程序中带有src目录,在程序中访问目录下的文件需要加上相对路径src/xxxx.txt,但在打包后不能正常访问文件。 在打包后不存在...
  • 按理来说分布式项目文件都应该上传到文件服务器,但是由于文件不是太多于是就放在了classpath下,在本地开发的时候发现都能正常下载文件,但是打包jar上传到Linxu测试环境上就报错,找不到classpath路径。...
  • 上网查资料,告知是因为达成jar包之后,文件路径获取不到,拿不到指定文件也是正常的,接下来就是解决方案的时候,网上大多是使用文件流的方式,但是我使用这种方式还是拿不到,希望有大佬可以告
  • 有时会遇到maven打包后找不到资源文件了,其实这时候路径发生了
  • **解决方法:**将工具类重新换个打包方式,然后将此jar包maven路径下引进去 打包方式有多种: 第一种:使用maven命令打包 mvn clean package 第二种: ​ 步骤1:选择你需要打包的工具类 步骤2:选择IDEA的build...
  • 在编写完Java程序打包成Jar时发布,会发现找不到Jar文件中的图片和文本文件,其原因是程序中载入图片或文本文件时,使用了以当前工作路径为基准的方式来指定文件路径。这与用户运行Jar包时的当前工作路径并不...
  • 以前都是在eclipse调试,第一次打包出来,依赖jre的地方都能正常运行,但是依赖第三方包的地方就提示找不到依赖。导出的jar解压发现的确没有依赖,classpath文件有表明依赖包路径,都是在本机,却无法运行。请问...
  • 遇到的问题是: 在使用springboot时,在开发软件中运行下载文件的功能时,文件路径正确,...当打包成可执行jar文件,再用java -jar 运行时,下载文件的功能报错,系统找不到指定路径和文件路径不正确。 求大神帮助
  • 引用第三方jar包找不到类库

    千次阅读 2015-11-04 15:49:06
    jar应用中使用到第三方jar包打包成应用,一直提示第三方的jar中的class文件找不到。 查看打包的jar应用,已经将第三方的jar包打包到了新的jar包中,但是仍然提示class文件找不到。 查看jar应用的manifest.mf...
  • java打包后路径问题

    千次阅读 2014-02-25 22:01:41
    用netbeans做了个应用程序,其中应用了一些图片,还有几个声音文件,调试运行都没有问题,打包生成jar后,运行jar文件时,这些图片、声音确出来。这个问题困惑我好长时间。 书籍中例题、搜网络文章,自己试了...
  • java程序打包jar,图片文件问题

    千次阅读 2012-05-27 21:13:12
    在编写完Java程序打包成Jar时发布,会发现找不到Jar文件中的图片和文本文件,其原因是程序中载入图片或文本文件时,使用了以当前工作路径为基准的方式来指定文件路径。这与用户运行Jar包时的当前工作路径并不...
  • 因此普通正常文件的读写功能受影响,而一旦打包后,可能会由于我们自己的文件目录放置原因一是没有被正确打包到jar包中,第二个即使被打包进去,由于jar包并不会解压服务器中,因此如果我们按照正常的文件路径去...
  • 用beyondcompare3比较两jar,大小相同,解压缩所有文件二进制相同,但自动的就是找不到主类。 java1.8,windows7 64,类路径是.,主类是test.Helloworld,自动和手动的在同意目录下,cd分别java -jar xxx....
  • 如果是自己写的工具类修改后要打成工具包,原因可能是由于maven的缓存涉及那个class文件的jar包保存了本地maven库中,修改那个jar包后没有更新本地库 证明方式: 步骤1:将你要打成jar包运行的程序里的pom.xml里...
  • 问题描述:在编写完Java程序打包成Jar时发布,会发现找不到Jar文件中的图片和文本文件,其原因是程序中载入图片或文本文件时,使用了以当前工作路径为基准的方式来指定文件路径。这与用户运行Jar包时的当前...

空空如也

空空如也

1 2 3 4 5
收藏数 88
精华内容 35
关键字:

打包jar包后文件路径找不到