文档章节

Ant 中 *Log4j.properties 找不到文件的问题

xiaofer2008
 xiaofer2008
发布于 2011/01/14 10:22
字数 1628
阅读 1723
收藏 2

 在用 Ant 进行构建,部署,运行过程中,发现一小问题,就是在运行时总是提示“系统找不到指定的文件”。害得我花了不少时间,最后终于弄清楚了问题的原因。以下的错误代码(贴出来好让后面的人更容易找到这样贴子。:))

[java] log4j:ERROR Could not read configuration file [HelloWroldLog4j.properties].
[java] java.io.FileNotFoundException: HelloWroldLog4j.properties (系统找不到指定的文件。)
[java]     at java.io.FileInputStream.open(Native Method)
[java]     at java.io.FileInputStream.<init>(FileInputStream.java:106)
[java]     at java.io.FileInputStream.<init>(FileInputStream.java:66)
[java]     at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:316)
[java]     at org.apache.log4j.PropertyConfigurator.configure(PropertyConfigurator.java:342)
[java] H:\jstudy\ant\use_log4j\build\jar
[java] File:  true
[java]     at antstudy.HelloWorld.main(Unknown Source)
[java] log4j:ERROR Ignoring configuration file [HelloWroldLog4j.properties].
[java] log4j:WARN No appenders could be found for logger (antstudy.HelloWorld).
[java] log4j:WARN Please initialize the log4j system properly.


  由于文件中用到的PropertyConfigure.configure(String fileName),最终还是利用了FileInputStream来读取配置文件的,所以fileName与FileInputStream构造时的fileName是相同的。于是我把问题简化为用 Ant 来进行只包括 FileInputStream 类的简单的代码,出现了相同问题。由于使用了相对路径,所以只要可以确认当前的目录,就可以解决问题了。利用 System.getProperty("user.dir") 终于找出来,当前用户工作目录是 Ant 的 build.xml 的路径。在查看了Ant 的文档, Java 任务可以设置 dir 属性来修改 JAVA 用户工作目录,当然要把 Java 任务的 fork 设置为 true。问题解决!

  总结,问题的根本原因还是 Java 工作目录的设置
。在用 Ant 进行执行 Java 任务时,JAVA用户工作目录是 builde.xml 所有的目录(如果没有修改的话),我想通常遇到我这样问题的人,都没有修改Java 任务的工作目录。

  还有一个小问题没有得到解决,就是让 Ant 打包以后,这些配置文件怎么处理, *.properties 文件应不应该放到Jar包中呢?如果放在包中,

  1. *.properties文件将不能再进行手动设置了,缺乏的其配置的灵活性。
  2. 我不知道该怎么去访问这个文件了,我目前的水平对这个一点也没办法,或者说要实现起来比较复杂。

  我的做法是,把当前工作目录设置到Jar包所在的目录,并且把*.properties文件复制到这个目录下面,也就,不对*.properties 文件打包。

  不知道实际工作中是怎么解决这样的问题的。希望有人会回答我的这个问题,先谢过了。

  基本上找到了上面遗留问题的解决方法[续上]:
  也就是 Jar 包中的文件的读取,在CSDN中有这样的贴子。可以去看看,讨论得很详细:
如何读取自身Jar包中的文件 部分内容节选如下:
 

   在编写完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),这需要您必须将图片和文本等文件的保存路径,和程序中指定的路径两者保持一致。

maquan

> 什么文件可以?  .bat 不行的话. . 
> 哪些文件是可以的?  image.?  or?

问题的本质是这样的:如果你要用自己的程序去读文件,什么类型的文件都一样可以读到(就用你说的 getResource());但是,.BAT 文件是给操作系统用的,操作系统并不支持从 jar 文件里运行一个 BAT 文件。

所以,如果你一定要把 BAT 文件打到 jar 包里,那只能自己写程序读出这个文件的内容,再写到一个操作系统能看到的地方(也就是写到硬盘上的一个文件里),再让操作系统去运行它。

BTW: JAR 的意思就是 Java ARchive,顾名思义,就像老紫竹说的,“应该把非java文件放到外面”。

© 著作权归作者所有

共有 人打赏支持
xiaofer2008
粉丝 12
博文 9
码字总数 14282
作品 0
济南
私信 提问
请教如何在linux下使用 ant

我在windows 下 成功使用ant从 svn上下载文件 可是我把windows 下的 ant文件夹拷贝到linux下 配置好环境变量 方法如下: export ANT_HOME=/usr/ant export PATH=/usr/ant/bin:$PATH 可以使用e...

genghuan
2010/07/15
2.7K
1
部署公司打包工具需要注意的一些问题

公司利用ant提供了一个打包环境,大概的功能是通过ant直接checkout cvs服务器上面的代码,编译后生成能够直接部署在weblogic服务器上的ear包。 虽然有部署文档,坑却还是有。ant是必须安装的...

彭苏云
2014/04/02
0
0
将tamcat7源码导入eclipse中

在网上看了很多的教程,总算弄好了,贴出来给大家分享一下 首先到ant官网http://ant.apache.org/bindownload.cgi下载ant工具然后随便解压到某个目录,将ant目录中的bin目录添加到环境变量pat...

那位先生
2015/02/12
0
4
windows下安装ant

1、下载,到ANT官方网站http://ant.apache.org/下载最新版本,解压到C:ant目录下 2、配置环境变量:我的电脑----属性----高级-----环境变量,添加如下 ANT_HOME:C:ant JAVA_HOME:C:Jdk(是J...

sucre
2014/07/31
0
0
Ant编译android,并Proguard代码混淆,v4混淆配置

忙了三四周,总算把购开心的ios版(appStore搜“购开心”)成功翻译成了android版,UI效果基本保持一致,上一张UI效果图吧,很养眼的: 还不错吧,进入正题吧。 以前一直是让我徒弟混淆和打包的...

辉兔狼
2013/09/03
0
1

没有更多内容

加载失败,请刷新页面

加载更多

matlab-线性代数 齐次方程组 基础解系和通解

  matlab : R2018a 64bit     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   code clearclc% x1+2*......

志成就
34分钟前
1
0
一线互联网技术推荐:Java工程师架构知识系统化汇总,面完45K!

根据高端招聘平台100 offer发布的Java人才盘点报告,在过去的2018年,Java仍然是最流行、招聘供需量最大的技术语言。 在此基础上,互联网行业针对 Java 开发的招聘需求,也是近年技术类岗位供...

java知识分子
41分钟前
5
0
JAVA并发编程JUC基础学习(简介)

之前写过一篇并发编程的简单实例应用,Future快速实现并发编程,可以很快的在自己的项目中应用,但并不系统,之前说过总结一篇(或者一系列)java.util.concurrent 这个并发编程工具类的学习...

小海bug
43分钟前
2
0
简单描述PHP发展历程

PHP简介 PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域...

问题终结者
53分钟前
3
0
结构体指针需要初始化

过年过的大脑已经瓦特了。 #include <stdio.h>#define N 10#define MAXSIZE 100typedef struct {int r[MAXSIZE+1];/* 用于存储要排序数组 */ int length;/* 用于记录顺序表的...

niithub
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部