`
daniel_tu
  • 浏览: 184463 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JAVA打包后读取自身JAR中的文件

    博客分类:
  • Java
阅读更多

在编写完Java程序后,打包成Jar时发布,会发现找不到Jar文件中的图片和文本文件,其原因是程序中载入图片或文本文件时,使用了以当前工作路径为基准的方式来指定文件和路径。这与用户运行Jar包时的当前工作路径并不一致。

问题分析:
例如:以Windows为例说明,以下是开发项目“AAA”的部分代码,开发和调试时的根路径为D:\aaa,这样程序运行时当前路径为"D:\aaa",大家可以用System.getProperty("user.dir")方法求证当前用户工作路径。

//下面代码使用了基于当前工作路径的方式指定了文件对象
File  imageFile  =  new  File("/images/sample.gif");
ImageIcon  imageIcon  =  new  ImageIcon(File.toURI);
File  iniFile  =  new  File("/conf.ini");
FileInputStream  fileInputStream  =  new  FileInputStream(iniFile.toURI);
/*
  *这样程序会去找以下两个文件:
  *    D:\aaa\images\sample.gif
  *    D:\aaa\conf.ini
  */

以上的代码应用绝对路径信息指定了文件对象,在开发和调试期(未打包前),是没有问题的,但在打包后,由于所有图片文件和文本文件都将打包到Jar文件 中,由于System中的"user.dir"属性发生了变化,会造成用绝对路径的方式无法找到Jar文件中包含路径和文件。例如大家将上面的项目 “AAA”中的所有类文件、图片文件和文本文件等打包为E:\aaa.jar文件并发布,在用户执行该aaa.jar中的程序时,当前路径取决于用户运行 该程序的当前路径。

例如:  在“E:\”目录下运行该程序:

E:\> java  -jar  aaa.jar

此时用户的当前路径(System的user.dir属性)是“E:\”,而非开发者所期望的“E:\aaa”,所以会按以下路径来搜索文件:
    E:\images\sample.gif
    E:\conf.ini
但是所有的图片和文本文件包含在E:\aaa.jar文件中,所以会致使程序无法正常运行。

问题解决:

为了解决上述问题,推荐采用Java本身以类为基准的路径搜索方式。
例如:
/*
  *以下代码采用了以当前类为基准的路径指定方式。下面这行代码在运行时,会
  *在jar文件中的根路径,搜索程序中用到的文件。
Reader  reader  =new  InputStreamReader(
        getClass().getResourceAsStream("/image/Environment.ini"));
ImageIcon  i=new  ImageIcon(getClass().getResource("/image/b1.gif"));

以上两行代码采用了下面两条Java语句:
        getClass().getResourceAsStream("FileName");
        getClass().getResource("File");
含有这种代码的程序在运行时,以类(类路径)为基准,而不依赖当前路径(System中的user.dir)。

注意:上面的路径"/image/Environment.ini"如果写成"image/Environment.ini",将表示在类同路径下的路径 (className/image/Environment.ini),这需要您必须将图片和文本等文件的保存路径,和程序中指定的路径两者保持一致。

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Test {

public Test (){

  try {
    //  "/Test/123.txt" 相对于包的路径,区分大小写
     InputStream input= this .getClass () .getResourceAsStream ( "
/image/sample.gif " ) ;
     System.out.println ( this .getClass () .getResource ( "/
conf.ini " )) ;
   
     BufferedReader in= new BufferedReader ( new InputStreamReader ( input )) ;
     String a;
     while ( true ){
      a=in.readLine () ;
    
      if ( a== null )

               break ;
    
      System.out.println ( a+ "-----" ) ;
     }
     in.close () ;
    } catch ( IOException e ) {
     e.printStackTrace () ;
    }
  
}

public static void main ( String [] args ){
    new Test () ;
   }
}

分享到:
评论
1 楼 asunnytiger 2009-08-18  
谢谢帮助了,呵呵,不过觉得这句
引用
为了解决上述问题,推荐采用Java本身以类为基准的路径搜索方式。
例如:
/*以下代码采用了以当前类为基准的路径指定方式。下面这行代码在运行时,会
*在jar文件中的根路径,搜索程序中用到的文件。
Reader  reader  =new  InputStreamReader(
        getClass().getResourceAsStream("/image/Environment.ini"));

感觉加斜杠以包为基准不加以类为基准,呵呵

相关推荐

    JAVA打包后读取自身JAR中的文件.pdf

    ### JAVA打包后读取自身JAR中的文件 #### 背景介绍 在Java开发过程中,经常需要将项目打包成一个可独立运行的JAR文件。这种打包方式不仅便于分发,还能保护项目的源代码不被轻易查看。然而,在打包过程中,可能会...

    Eclipse打包成JAR包读取外部JAR包和外部配置文件

    然而,当项目完成后,我们需要将其打包成可执行的JAR文件,以便在其他环境中运行。在某些情况下,我们的项目可能依赖于外部的JAR库或者需要读取外部的配置文件,这在打包时需要特别处理。本文将详细介绍如何在...

    Java实现从jar包中读取指定文件的方法

    在给定的代码示例中,`JarFileAccess`类展示了如何读取JAR文件中的指定文件并将其复制到目标目录。 1. **创建`JarFile`对象**: 使用`new JarFile()`构造函数创建`JarFile`对象,传入JAR文件的路径。这将打开JAR...

    JAR文件读取工具

    Java Archive (JAR) 文件是Java平台上的一个重要组成部分,它主要用于打包Java类、资源文件以及元数据。JAR文件的出现使得Java开发者能够将多个类文件组合成一个单一的可执行文件,方便分发和执行。在Java开发过程中...

    spring读取jar中的配置文件

    当我们的应用程序被打包成JAR文件后,有时我们需要从JAR内部读取配置文件,例如application.properties或application.yml。本文将深入探讨如何在Spring框架中实现这一功能。 首先,理解Spring的资源配置。Spring...

    解决java打包之后无法加载静态资源的问题SWTResourceManager.java源码

    利用swt中的一个获取图片的类SwingResourceManager 来解决将程序打为使用java打包之后,生成的jar包中图片找不着的。这是因为通过class.getResource()方法在IDEA中运行的路径和生成jar包获取的的路径是不同的。打成...

    JAVA打包成可运行的JAR程序

    JAVA打包成可运行的JAR程序 在 Java 开发中,为了方便程序的部署和分发,通常需要将程序打包成可执行的 JAR 文件。在这个过程中,需要注意几个重要的步骤,包括将依赖的 lib 包和配置文件正确地配置,生成 Class-...

    Java —— jar读取自身图片和文本(.txt)文件(含源代码)

    JarInputStream jarInput = new JarInputStream(new FileInputStream("读取jar自身.exe")); JarEntry entry; while ((entry = jarInput.getNextJarEntry()) != null) { if (entry.getName().equals("data.txt"))...

    从jar文档中读取文件

    要从 JAR 文件中得到它所包含的文件内容,可以使用 Java 提供的 JarFile 类,它是一个 .jar 文件自身的引用。其中的每个文件则由 JarEntry 引用。可以传递一个参数给 JarFile 的构造函数创建一个 JarFile 实例,这个...

    JAVA 打包(jar\tar\zip)源码

    在Java项目工程中,打包过程可能包括编译源代码、复制资源文件、生成类文件、创建或更新manifest文件,然后将这些元素整合到jar、tar或zip文件中。IDEs如Eclipse、IntelliJ IDEA和Maven、Gradle等构建工具都提供了...

    读取war包或jar包内的文件

    1. **Java ClassLoader**: 读取JAR或WAR包内的文件通常需要借助Java的ClassLoader。ClassLoader是Java中负责加载类的组件,它知道如何从不同的源(如文件系统、网络或ZIP文件)加载类和资源。 2. **getResource() ...

    java打包工具【fat-jar】

    Java打包工具Fat-Jar是Java开发者在构建可执行的独立JAR文件时经常会用到的一种工具。它解决了Java应用程序依赖于多个外部库的问题,能够将所有必要的类和库资源打包进一个单一的JAR文件中,使得用户可以简单地通过...

    java 打包可执行文件

    总结来说,Java中的打包可执行文件涉及到JAR文件的创建、清单文件的编写、使用构建工具自动化打包过程,以及可能的批处理加载逻辑。了解这些概念和技术对于Java开发者来说非常重要,能够帮助他们有效地部署和管理...

    java读取mpp文件

    为了创建一个可执行的JAR包,你可以使用构建工具(如Maven或Gradle)将你的Java代码打包成JAR,并确保所有依赖项都被包含在内。 总之,`mpxj`是Java开发者处理MPP文件的强大工具,它简化了与Microsoft Project文件...

    java读取项目中的文件(src目录下)

    这种方法允许你在打包后的JAR或WAR文件中正确地访问资源。 6. **处理资源路径**: - 文件路径可能需要根据运行环境进行调整。例如,开发阶段文件可能在`src/main/resources`,但在生产环境中,它们可能被复制到了`...

    java打包工具fatjar插件(官网0.0.31版本)

    Java打包工具Fatjar插件是Java开发者在构建可执行的JAR文件时常常使用的工具,尤其对于那些希望将所有依赖库合并到一个独立的JAR中的项目非常实用。Fatjar这个名字来源于它能创建的“肥胖”JAR,因为它将所有依赖的...

    Eclipse打包成JAR包读取外部JAR包和外部配置文件(源码)

    总结,打包JAR包并在其中读取外部JAR和配置文件,需要理解Java类路径的概念,熟练运用Eclipse的打包功能,以及正确处理MANIFEST.MF文件。同时,掌握使用构建工具如Maven或Gradle会大大提高效率。在实际项目中,确保...

    怎么将java的类文件打包成jar文件

    在软件开发过程中,特别是对于 Java 开发者来说,将多个 `.class` 文件打包成一个 `.jar` 文件是非常常见且实用的操作。这种方式不仅便于程序的分发与部署,还能有效管理项目的依赖关系。本文将详细介绍如何将 Java ...

    自动打包.java文件成.jar的小程序(C++)

    Java编程语言以其跨平台性和丰富的库支持而广受欢迎,但为了在不同的系统上运行Java程序,我们需要将编译后的.class文件打包成一个可执行的JAR(Java Archive)文件。本篇文章将详细介绍如何使用C++编写一个小程序来...

    读取,修改jar文件

    - 使用`java.util.jar.JarFile`类可以打开并读取JAR文件。这个类提供了访问JAR内容的方法,如`getEntry()`和`getInputStream()`,可以用来获取指定条目的输入流。 - 例如,要读取`DbParamDlg.class`,你可以创建`...

Global site tag (gtag.js) - Google Analytics