读取压缩 war 存档中的文件和目录
Reading files and directories within compressed war archive
我正在尝试访问压缩的 war 存档中的文件夹,但没有成功。
存档结构:
app.war
|- META-INF
|- org
|- WEB-INF
|- classes
|- com
|- static
|- testcases
|- 1
|- 2...
|- ...22
|- README.txt (file)
|- TEST.CASE (file)
这是我读取目录testcases:
内容的代码
URL url = Thread.currentThread().getClass().getClassLoader().getResource("testcases");
LOG.debug("PROTOCOL=" + url.getProtocol());
List<String> files = IOUtils.readLines(url.openStream());
LOG.debug("DIRS=" + files.size());
LOG.debug("PATH=" + url.getPath());
for (String s : files)
LOG.debug(s);
运行 在 eclipse 中我得到的输出是:
TestCaseUtil : PROTOCOL=file
TestCaseUtil : DIRS=22
TestCaseUtil : PATH=/C:/Users/{Name}/development/git/app/target/classes/testcases
TestCaseUtil : 1
...
TestCaseUtil : 22
当我使用 java -jar app.war
从命令行执行 war 时,我得到以下输出:
TestCaseUtil : PROTOCOL=jar
TestCaseUtil : DIRS=0
TestCaseUtil : PATH=file:/C:/Users/{Name}/development/git/app/target/app.war!/WEB-INF/classes!/testcases
谁能告诉我哪里做错了?
你没有做错什么。
当您 运行 eclipse
中的项目时,它将在 target
文件夹中保留已编译的 class 文件,而不是实际的 war
文件结构。
但是当您创建 war
文件时,所需的 class 个文件将移动到 WEB-INF/classes
文件夹下。
因此结果不同。只需确保当您创建 WAR 文件时,其中包含所需的 folders/classes,并且您可以使用任何 ZIP 实用程序对其进行验证。
文件系统 为 zip 文件和 class 路径资源提供虚拟文件系统。
Map<String,?> env = new HashMap<>();
URL url = getClass().getResource("/META-INF/MANIFEST.MF");
// Correct the URL to either file system or war
{
String s = url.toString()
.replaceFirst("/META-INF/MANIFEST.MF", "")
.replaceFirst("\!.*$", ""); // In case of war
url = new URL("jar:" + s); // Use jar:file: ...
}
FileSystem fs = FileSystems.newFileSystem(url.toURI(), env);
Path path = fs.getPath("/WEB-INF/classes/testcases");
Set<FileVisitOption> options = ...
int maxDepth = 1;
FileVisitor<? super Path> visitor = ...
Files.walkFileTree(path, options, maxDepth, visitor);
这是一个工作片段(所有功劳都归功于用户 Eggen 提供的代码库):
Map<String, ?> env = new HashMap<>();
URL url = getClass().getResource("/META-INF/MANIFEST.MF");
LOG.debug("MANIFEST=" + url.toURI());
// Correct the URL to either file system or war
{
String s = url.toString().replaceFirst("META-INF/MANIFEST.MF", ""); // In case of war
url = new URL(s); // Use jar:file: ...
LOG.debug("ARCHIVE=" + url.toURI());
}
FileSystem fs = FileSystems.newFileSystem(url.toURI(), env);
LOG.debug("FILESYSTEM=" + fs.isOpen());
Path path = fs.getPath("/WEB-INF/classes/testcases");
LOG.debug("PATH=" + path.getFileName());
Set<FileVisitOption> options = new HashSet<FileVisitOption>();
int maxDepth = 1;
FileVisitor<Path> visitor = new FileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
LOG.debug(file.getFileName());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
};
Files.walkFileTree(path, options, maxDepth, visitor);
预期输出:
TestCaseUtil : MANIFEST=jar:file:/C:/Users/{Name}/development/git/app/target/app.war!/META-INF/MANIFEST.MF
TestCaseUtil : ARCHIVE=jar:file:/C:/Users/{Name}/development/git/app/target/app.war!/
TestCaseUtil : FILESYSTEM=true
TestCaseUtil : PATH=testcases
TestCaseUtil : 1/
...
TestCaseUtil : 22/
我正在尝试访问压缩的 war 存档中的文件夹,但没有成功。
存档结构:
app.war
|- META-INF
|- org
|- WEB-INF
|- classes
|- com
|- static
|- testcases
|- 1
|- 2...
|- ...22
|- README.txt (file)
|- TEST.CASE (file)
这是我读取目录testcases:
内容的代码URL url = Thread.currentThread().getClass().getClassLoader().getResource("testcases");
LOG.debug("PROTOCOL=" + url.getProtocol());
List<String> files = IOUtils.readLines(url.openStream());
LOG.debug("DIRS=" + files.size());
LOG.debug("PATH=" + url.getPath());
for (String s : files)
LOG.debug(s);
运行 在 eclipse 中我得到的输出是:
TestCaseUtil : PROTOCOL=file
TestCaseUtil : DIRS=22
TestCaseUtil : PATH=/C:/Users/{Name}/development/git/app/target/classes/testcases
TestCaseUtil : 1
...
TestCaseUtil : 22
当我使用 java -jar app.war
从命令行执行 war 时,我得到以下输出:
TestCaseUtil : PROTOCOL=jar
TestCaseUtil : DIRS=0
TestCaseUtil : PATH=file:/C:/Users/{Name}/development/git/app/target/app.war!/WEB-INF/classes!/testcases
谁能告诉我哪里做错了?
你没有做错什么。
当您 运行 eclipse
中的项目时,它将在 target
文件夹中保留已编译的 class 文件,而不是实际的 war
文件结构。
但是当您创建 war
文件时,所需的 class 个文件将移动到 WEB-INF/classes
文件夹下。
因此结果不同。只需确保当您创建 WAR 文件时,其中包含所需的 folders/classes,并且您可以使用任何 ZIP 实用程序对其进行验证。
文件系统 为 zip 文件和 class 路径资源提供虚拟文件系统。
Map<String,?> env = new HashMap<>();
URL url = getClass().getResource("/META-INF/MANIFEST.MF");
// Correct the URL to either file system or war
{
String s = url.toString()
.replaceFirst("/META-INF/MANIFEST.MF", "")
.replaceFirst("\!.*$", ""); // In case of war
url = new URL("jar:" + s); // Use jar:file: ...
}
FileSystem fs = FileSystems.newFileSystem(url.toURI(), env);
Path path = fs.getPath("/WEB-INF/classes/testcases");
Set<FileVisitOption> options = ...
int maxDepth = 1;
FileVisitor<? super Path> visitor = ...
Files.walkFileTree(path, options, maxDepth, visitor);
这是一个工作片段(所有功劳都归功于用户 Eggen 提供的代码库):
Map<String, ?> env = new HashMap<>();
URL url = getClass().getResource("/META-INF/MANIFEST.MF");
LOG.debug("MANIFEST=" + url.toURI());
// Correct the URL to either file system or war
{
String s = url.toString().replaceFirst("META-INF/MANIFEST.MF", ""); // In case of war
url = new URL(s); // Use jar:file: ...
LOG.debug("ARCHIVE=" + url.toURI());
}
FileSystem fs = FileSystems.newFileSystem(url.toURI(), env);
LOG.debug("FILESYSTEM=" + fs.isOpen());
Path path = fs.getPath("/WEB-INF/classes/testcases");
LOG.debug("PATH=" + path.getFileName());
Set<FileVisitOption> options = new HashSet<FileVisitOption>();
int maxDepth = 1;
FileVisitor<Path> visitor = new FileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
LOG.debug(file.getFileName());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
};
Files.walkFileTree(path, options, maxDepth, visitor);
预期输出:
TestCaseUtil : MANIFEST=jar:file:/C:/Users/{Name}/development/git/app/target/app.war!/META-INF/MANIFEST.MF
TestCaseUtil : ARCHIVE=jar:file:/C:/Users/{Name}/development/git/app/target/app.war!/
TestCaseUtil : FILESYSTEM=true
TestCaseUtil : PATH=testcases
TestCaseUtil : 1/
...
TestCaseUtil : 22/