0
点赞
收藏
分享

微信扫一扫

【java】ClassLoader.getResources加载资源的顺序

犹大之窗 2022-01-24 阅读 47
java

目录

前言

  • 【java】ClassLoader.getResources加载资源

代码说明

目录结构

LoadResources
├─FromMultiJar
│  ├─src
│  │   └─main
│  │      ├─java
│  │      │  └─test
│  │      └─resources
│  │          └─a.txt
│  pom.xml
├─WebJar1
│  └─src
│      └─main
│         ├─java
│         └─resources
│             └─a.txt
└─WebJar2
    └─src
        └─main
           ├─java
           └─resources
               └─a.txt

FromMultiJar/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>test</groupId>
	<artifactId>FromMultiJar</artifactId>
	<packaging>jar</packaging>

	<properties>
	</properties>

	<dependencies>
		<dependency>
			<groupId>test</groupId>
			<artifactId>WebJar2</artifactId>
			<version>1.0</version>
		</dependency>
		<dependency>
			<groupId>test</groupId>
			<artifactId>WebJar1</artifactId>
			<version>1.0</version>
		</dependency>
	</dependencies>

	<build>
		<finalName>${project.artifactId}</finalName>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<version>2.6</version>
				<configuration>
					<archive>
						<manifest>
							<addClasspath>true</addClasspath>
							<classpathPrefix>lib/</classpathPrefix>
							<mainClass>test.Test</mainClass>
						</manifest>
					</archive>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<executions>
					<execution>
						<id>copy-dependencies</id>
						<phase>package</phase>
						<goals>
							<goal>copy-dependencies</goal>
						</goals>
						<configuration>
							<outputDirectory>
								${project.build.directory}/lib
							</outputDirectory>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>

代码

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.Enumeration;

public class Test {
	public static void main(String[] args) throws UnsupportedEncodingException, IOException {
		ClassLoader classLoader = TestC.class.getClassLoader();
		String fileName = "a.txt";

		/* 获取资源文件 */
		System.out.println("-------------选中的资源文件--------------");
		URL url = classLoader.getResource(fileName);
		PrintUtil.print(url);

		/* 打印资源文件内容 */
		System.out.println("-------------资源文件内容--------------");
		try (LineNumberReader lnr = new LineNumberReader(
				new InputStreamReader(classLoader.getResourceAsStream(fileName), "utf-8"))) {
			for (String str = lnr.readLine(); null != str; str = lnr.readLine()) {
				System.out.println(str);
			}
		}

		/* 获取资源文件列表 */
		System.out.println("-------------所有符合条件的资源文件列表--------------");
		Enumeration<URL> urls = classLoader.getResources(fileName);
		while (urls.hasMoreElements()) {
			PrintUtil.print(urls.nextElement());
		}
	}
}

编译后目录结构

D:/LoadResources
├─FromMultiJar.jar
└─lib
   ├─WebJar1.jar
   └─WebJar2.jar

启动命令

java -jar FromMultiJar.jar

ClassLoader.getResources加载资源的顺序

  • 先在本应用(FromMultiJar.jar)中寻找
  • 如本应用(FromMultiJar.jar)未找到,则按照classpath顺序查找

先在本应用(FromMultiJar.jar)中寻找

FromMultiJar.jar包含a.txt,则查找结果为:file:/D:/LoadResources/FromMultiJar.jar!/a.txt

如本应用(FromMultiJar.jar)未找到,则按照classpath顺序查找

java -jar xxx.jar 方式启动程序后,使用MATE-INF/MANIFEST.MF中的classpath。按照MATE-INF/MANIFEST.MF中jar的顺序进行查找。
在这里插入图片描述

举报

相关推荐

0 条评论