`
newslxw
  • 浏览: 213970 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

打包成jar后的文件读取问题

阅读更多
打包成JAR后的配置文件读取方式和没打包的不一样,
为了兼容两种模式,
1、spring配置文件中引用属性文件方法
bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
	  <property name="locations">
	   <list>
	   <value>file:**/config/pos_jdbc.properties</value>
	   </list>
	  </property>
	 </bean>

用file:**让spring去查找文件

2、手工读取spring配置文件的方法,如SpringUtils中
private static ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:config/applicationContext_Pos.xml");


3、读取文件时应该区分文件在jar中还是jar的同级目录中,如图片等,一般是不打包到jar中,这么读取文件
	/**
	 * 获取项目的文件的输入流,如果项目在jar中,则先在jar中查找文件,找不到再到jar外面查找文件
	 * @param filePath
	 * @return
	 * @throws IOException 
	 */
	public static InputStream getProjectFile(String filePath) throws IOException
	{
		InputStream in = null;
		
		String currentJarPath = URLDecoder.decode(Constants.class
				.getProtectionDomain().getCodeSource().getLocation().getFile(),
				"UTF-8"); // 获取当前Jar文件名
		String path = Constants.class.getResource("").getPath();
		if (path.indexOf("!") != -1)
		{// 在jar中
			logger.info(filePath + " is in jar");
			JarFile currentJar = new JarFile(currentJarPath);
			JarEntry dbEntry = currentJar.getJarEntry(filePath);
			if (dbEntry != null)
				in = currentJar.getInputStream(dbEntry);
		}
		if (in == null)
		{
			// String loaderPath =
			// Thread.currentThread().getContextClassLoader().getResource("").getPath();
			logger.info(filePath + " is not in jar");
			String loaderPath = currentJarPath;
			String packPath = Constants.class.getPackage().toString();
			packPath = packPath.replace("package ", "");
			packPath = "/" + packPath.replace(".", "/");
			if (!loaderPath.endsWith("/"))
				loaderPath = loaderPath.substring(0, loaderPath
						.lastIndexOf("/"))
						+ "/";
			loaderPath = loaderPath.replace(packPath, "");
			String tPath = loaderPath + filePath;
			logger.info("file the path =" + tPath);
			in = new FileInputStream(tPath);
		}
		return in;
	}
	

4、读取图片的方法
jar中时使用相对路径读取,路径不能以/开头,且不能用getResource,方法如下
//imgPath在jar中是空字符串,非jar中是/
	public static ImageIcon createImageIcon(String path) {
		String tmp = path;
		if(tmp != null && tmp.startsWith("/"))
		{
			path = path.substring(1);
		}
		try
		{
			String imgPath = Constants.getImgPath();
			if("".equals(imgPath))
			{//在jar中
	            return new ImageIcon(path);
			}
			else
			{
				return new ImageIcon(ImageIcon.class.getResource(imgPath + path));
			}
		}
		catch(Exception e)
		{
			LogUtils.Log(logger, e);
			return null;
		}
    }


5、保存文件时,使用绝对路径,绝对路径获取方式
private static String RealClzPath=null; //classes目录的物理路径
	private static Logger logger = Logger.getLogger(Constants.class);
	private static String imgPath = null;  //图片路径前置,如果项目打包成JAR,前置为空,如果项目没打包,这前置为"/"
	static
	{
		String currentJarPath = null;
		try
		{
			currentJarPath = URLDecoder.decode(Constants.class.getProtectionDomain().getCodeSource().getLocation().getFile(), "UTF-8");
		}
		catch (UnsupportedEncodingException e)
		{
			LogUtils.Log(logger, e);
		} 
		String path = Constants.class.getResource("").getPath();
		int pos = path.indexOf("!"); 
		if(pos != -1)
		{//在jar中
			logger.info("class is in jar");
			RealClzPath = path.substring(0,pos);
			pos = RealClzPath.lastIndexOf("/");
			imgPath = "";
			if(pos != -1)
			{
				RealClzPath = path.substring(0,pos+1);
			}
		}	
		else
		{
			//String loaderPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
			imgPath = "/";
			String loaderPath = currentJarPath;
			String packPath = Constants.class.getPackage().toString();
			packPath = packPath.replace("package ", "");
			packPath = "/" + packPath.replace(".", "/");
			loaderPath = loaderPath.replace(packPath, "");
			RealClzPath = loaderPath;
		}
		logger.info("RealClzPath = " + RealClzPath + " imgPath=" + imgPath);
		
	}
分享到:
评论

相关推荐

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

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

    把jsp编译打包成jar

    然而,在某些场景下,我们可能需要将JSP页面转换为Servlet并打包成jar文件,以便于部署或运行。这通常在不支持JSP直接执行的环境下进行,例如在简单的Java应用服务器或者微服务架构中。 标题“把jsp编译打包成jar”...

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

    下面我们将详细探讨如何在Eclipse中打包JAR包,并读取外部JAR包和外部配置文件。 首先,我们需要了解JAR文件的结构。JAR文件是Java类文件和相关资源的容器,它们被组织成目录结构,类似于Unix或Windows的文件系统。...

    JAR文件读取工具

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

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

    - `cvfm` 表示创建一个新的 JAR 文件,并从指定的 Manifest 文件读取元数据。 - `myapplication.jar` 是输出的 JAR 文件名。 - `myapplication.mf` 是 Manifest 文件。 - `-C classdir .` 指定 `.class` 文件...

    从jar文档中读取文件

    通过这些步骤,可以读取 JAR 文件中的文件内容,并获得每个文件的名称、大小和压缩后的大小等信息。 此外, Java 2 SDK 标准版还提供了一个 jar 工具,可以在控制台下读写 JAR 文件。在实际应用中,可以根据需要...

    文件加密器(已打包成jar)

    【文件加密器(已打包成jar)】是一个使用Java编程语言开发的应用程序,它专注于数据安全,特别是对文件进行加密处理。在这个版本中,开发者针对先前版本的不足进行了改进,并添加了新的功能,以提供更全面的安全...

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

    在Java编程中,有时我们需要从已经打包的JAR文件中读取特定的资源文件,例如配置文件、图片或库。本篇文章将详细讲解如何在Java中实现从JAR包中读取指定文件的方法。 首先,Java提供了`java.util.jar`包,其中包含...

    JSP预编译和打包成jar

    预编译JSP可以减少应用程序启动时的解析时间,而将JSP打包成JAR文件则有利于资源的集中管理和部署。 首先,让我们了解**JSP预编译**的概念。JSP在第一次被请求时会被Web容器转换为Servlet(Java类),然后编译为...

    springboot 项目实现文件上传,显示,下载,打包为jar

    在Spring Boot项目中,文件上传、显示和下载是常见的需求,尤其在构建Web应用程序时。Spring Boot提供了一种简单而高效的方式来处理这些操作。这里我们将深入探讨如何在...最后,打包成JAR文件使得应用易于部署和运行。

    解决SpringBoot打成jar运行后无法读取resources里的文件问题

    在使用SpringBoot进行开发时,我们经常会遇到在开发环境中能够正常读取resources目录下的文件,但是一旦将应用打包成jar文件并部署到服务器上运行时,就无法访问到这些资源文件的问题。这是因为SpringBoot的打包机制...

    spring读取jar中的配置文件

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

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

    ### JAVA打包后读取自身JAR中的文件 #### 背景介绍 在Java开发过程中,经常需要将项目...通过上述解决方案和注意事项,可以在Java程序中正确地处理打包后的JAR文件中的资源文件读取问题,确保程序的稳定性和可靠性。

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

    3. **打包JAR**:使用jar命令将所有相关的.class文件和MANIFEST.MF打包成JAR。C++程序同样可以通过调用`system()`函数来执行这个命令。 以下是使用C++实现自动打包的思路: 1. **读取.java文件**:遍历目录,找出...

    C#对jar二次打包

    二次打包jar文件涉及到几个关键步骤: 1. **读取并解析jar文件**:首先,我们需要使用C#的`System.IO.Compression.ZipFile`类来读取和解压jar文件。这个类提供了方便的方法来打开、列出和提取zip文件(jar文件本质...

    springboot项目打成jar包后无法获取static下的静态资源文件的问题分析

    这个问题在开发和部署时非常常见,因为Spring Boot应用在运行时,会将静态资源打包到jar文件内部,直接使用文件路径读取方式将无法访问到这些资源。 首先,要理解Spring Boot应用打包后的资源访问机制。当Spring ...

    jar 包 内文件读取 文件内容

    - Maven和Gradle等构建工具允许你配置如何打包和处理JAR文件中的资源,比如在构建过程中自动处理资源文件的复制和替换。 通过这些方法,开发者可以方便地访问和操作JAR文件内部的文件内容,无论是简单的文本文件...

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

    利用swt中的一个获取图片的类...打成jar包后,获取图片的路径中有"xxx.jar!"这里面的内容是不能够被操作系统识别出来的,因此直接通过路径来获取文件是不可能,使用SWTResourceManager可实现这一功能。

    解决SpringBoot jar包中的文件读取问题实现

    在SpringBoot应用中,文件读取是一个常见的需求,但在打包成jar文件并部署后,由于文件不再位于文件系统中,而是被包含在jar包内部,所以传统的文件读取方式会失效。本文将深入探讨如何解决SpringBoot jar包中的文件...

Global site tag (gtag.js) - Google Analytics