如何从jar文件访问资源文件[重复]

2024-04-16

我读过很多类似的帖子,但我找不到解决我的问题的方法:我需要验证和解析 xml 文件。 (针对 xsd 架构进行验证)。问题是,在我的方法中,当我运行: mvn package 然后运行 ​​jar 文件时,出现以下错误:

java.lang.IllegalArgumentException: URI is not hierarchical
    at java.io.File.<init>(Unknown Source)
    at com.test.Main.main(Main.java:15)

这是我尝试过的:

后来编辑:源代码

如何将 InputStream 作为多个方法的参数传递,而不会出现流关闭异常?这是正确的做法吗?

public class DOMParserFile {

  private InputStream   inputXML;
  private InputStream inputXSD;
  private Set<CarPart> carParts;

  public DOMParserFile(InputStream xmlFile, InputStream xsdFile) {
    this.inputXML = xmlFile;
    this.inputXSD = xsdFile;
    carParts = new HashSet<CarPart>();
 }


 public void readFromXMLFile() throws Exception {

    if (XMLFileValidator.validateAgainstXSD(inputXML, inputXSD)) {

        DocumentBuilderFactory builderFactory = DocumentBuilderFactory
                .newInstance();
        DocumentBuilder builder = builderFactory
                .newDocumentBuilder();
        Document doc = builder.parse(inputXML);

        // get the carPart nodes
        NodeList carPartList = doc.getElementsByTagName("carPart");
        // store car parts into a list
        for (int i = 0; i < carPartList.getLength(); i++) {
            // build new car part object
            CarPart carPart = new CarPart();
            Node carPartNode = carPartList.item(i);
            if (carPartNode.getNodeType() == Node.ELEMENT_NODE) {
                Element elem = (Element) carPartNode;
                // set id
                carPart.setId(elem.getElementsByTagName("id").item(0)
                        .getTextContent());
                // set name
                carPart.setName(elem.getElementsByTagName("name").item(0)
                        .getTextContent());
                // set description
                carPart.setDescription(elem
                        .getElementsByTagName("description").item(0)
                        .getTextContent());
                // set quantity
                carPart.setQuantity(Integer.valueOf(elem
                        .getElementsByTagName("quantity").item(0)
                        .getTextContent()));
                // set manufacturer
                carPart.setPartManufact(elem
                        .getElementsByTagName("partManufacturer").item(0)
                        .getTextContent());
                // set price
                carPart.setPrice(Double.valueOf(elem
                        .getElementsByTagName("price").item(0)
                        .getTextContent()));
                // get the list of available vehicles
                NodeList vehicleNodeList = ((Element) carPartNode)
                        .getElementsByTagName("availableFor");
                Set<Vehicle> availableVehicles = new HashSet<Vehicle>();
                for (int j = 0; j < vehicleNodeList.getLength(); j++) {
                    Vehicle vehicle = new Vehicle();
                    Node vehicleNode = vehicleNodeList.item(j);
                    if (vehicleNode.getNodeType() == Node.ELEMENT_NODE) {
                        Element vehicleELement = (Element) vehicleNode;
                        // set vehicle's make
                        vehicle.setMake(vehicleELement
                                .getElementsByTagName("make").item(0)
                                .getTextContent());
                        // set vehicle's model
                        vehicle.setModel(vehicleELement
                                .getElementsByTagName("model").item(0)
                                .getTextContent());
                        // get the available list of years of fabrication
                        // for
                        // this vehicle
                        NodeList yearsList = ((Element) vehicleNode)
                                .getElementsByTagName("fabricationYear");
                        Set<Integer> years = new HashSet<Integer>();
                        for (int k = 0; k < yearsList.getLength(); k++) {
                            Node yearNode = yearsList.item(k);
                            if (yearNode.getNodeType() == Node.ELEMENT_NODE) {
                                Element yearElem = (Element) yearNode;
                                years.add(Integer.valueOf(yearElem
                                        .getAttribute("yearAttr")));
                            }
                        }
                        vehicle.setFabYears(years);
                        availableVehicles.add(vehicle);
                    }

                }
                carPart.setVehicles(availableVehicles);
            }
            carParts.add(carPart);
        }
    }

}

public void printCarParts(){
    for(CarPart p :carParts){
        p.output();
    }
}

}

XMLFileValidator 类

public class XMLFileValidator {


public static boolean validateAgainstXSD(InputStream xmlFile, InputStream xsdFile)
{
    try
    {
        SchemaFactory factory = 
            SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = factory.newSchema(new StreamSource(xsdFile));
        Validator validator = schema.newValidator();
        validator.validate(new StreamSource(xmlFile));
        System.out.println("The XML file IS valid");
        return true;
    }
    catch(Exception ex)
    {
        System.out.println("The XML file is NOT valid");
        System.out.println("Reason: " + ex.getLocalizedMessage());
        ex.printStackTrace();
        return false;
    }
  }
}

主班

public class Main {

   public static void main(String args[]){  


    try {

        InputStream inXML = Main.class.getResourceAsStream("/xml/carParts.xml");
        InputStream inXSD = Main.class.getResourceAsStream("/xml/carPartsWarehouse.xsd");





        //1. dom parsing method
        System.out.println("**********************DOM PARSING METHOD************************");
        DOMParserFile dom = new DOMParserFile(inXML,inXSD);
        dom.readFromXMLFile();
        dom.printCarParts();

        //2. sax parsing method
        System.out.println("***********************SAX PARSING METHOD*************************");
        SAXParserFile sax = new SAXParserFile(inXML,inXSD);
        sax.readDataFromXml();
        sax.printCarParts();

        //3. stax parsing method
        System.out.println("***********************StAX PARSING METHOD*************************");
        StAXParserFile stax = new StAXParserFile(inXML,inXSD);
        stax.readFromXml();
        stax.printCarParts();

    } catch (URISyntaxException e1) {
        e1.printStackTrace();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }       
}

好吧,这些都不是真的Files,它们是嵌入式资源。

您可以手动打开它们,因为.jar's are .zip文件,其中资源是文件。但这并不是处理它们的优雅方式。

但是您可以打开然后作为Stream http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getResourceAsStream%28java.lang.String%29. So:

InputStream s = Main.class.getResourceAsStream("/xml/carParts.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(s);
//process document
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从jar文件访问资源文件[重复] 的相关文章

随机推荐

  • 用户主目录中的 log4j 日志文件

    我正在开发一个可以在 OSX 和 Windows 上运行的应用程序 我希望将日志写入用户主目录 对于 OSX 它将位于 Users Library Application Support MyApp log 目录下 而在 Windows 下
  • 有没有可靠的方法来检测 io.js 或 node.js 是否正在运行?

    我可以推断 node js 或 io js 是否正在运行的唯一方法是检查process versions node 在 io js 中 我得到 1 0 4 我确信有更好的方法 有人知道吗 现在最可靠的解决方案是执行node h看看它是否包含
  • 静态元素交互

    我有以下代码 Enabled id gt let removal null if this props disabled removal span gt this onDelete id gt x span return removal 它
  • 新:类型“_InternalLinkedHashMap ”不是类型“DocumentSnapshot”的子类型

    抱歉 我现在正在编程 但我正在学习 请帮助我 我被这个问题困住了 这是我的第一个应用程序 几乎已经完成 因此需要类似的帮助才能完成它 我收到此错误 类型 InternalLinkedHashMap 不是类型 DocumentSnapshot
  • 何时添加组件类与用户控件?

    我有一个总体想法 并且有一些明显的情况 但对我来说也有一些灰色区域 什么时候最好使用从组件扩展以及什么时候最好创建用户控件 这与我试图解决的特定工作问题有关 但具体问题并不重要 这个问题的一般答案对我来说就足够了 在 WPF 和 Windo
  • 链接器错误已定义

    我正在制作一个nodejs插件 我的 Visual Studio 项目中有 5 个文件 comm h cc node main cc util h cc 我将它与图书馆链接node lib node main cc有一个功能 v8 Hand
  • 如何将 SSL 证书添加到 Bluemix java Cloud Foundry 应用程序?

    我正在使用 Spring Boot Java JDK 1 8 Java MongoDB 驱动程序和 MongoDB 开发微服务 我已经在 Bluemix 上创建了 MongoDB 实例 并且正在从 Java 微服务连接到该实例 Bluemi
  • 根据可能不存在于所有值上的分隔符将 pandas 列分成两部分

    我的数据框的一列看起来像这样 application blah 3 14 xyz 5 2 abc 代表软件 版本 我正在努力实现这样的目标 application name ver blah 3 14 blah 3 14 xyz 5 2 x
  • FormBorderStyle为NONE时的表单高度问题

    我有一个无边框表单 FormBorderStyle None 高度为23像素 在设计器中设置 当 NET 在运行时绘制我的表单时 它会绘制它38像素高 由于某种原因它增加了标题栏的高度 MessageBox Show this Height
  • 如何从意图中获取额外的日期?

    我正在打包一个意图 我添加的附加项之一是日期对象 如下所示 intent putExtra DATE EXTRA t getDate 后来 当我阅读附加内容时 我尝试像这样获取日期 this date new Date intent get
  • 修改 Spark RDD foreach 内的集合

    我试图在迭代 RDD 的元素时向映射添加元素 我没有收到任何错误 但修改没有发生 直接添加或迭代其他集合一切正常 scala gt val myMap new collection mutable HashMap String String
  • 将数据库名称设置为 SQL 中的变量

    目前 我正在根据一些业务规则在一个数据库到另一个数据库之间进行一些数据迁移 我正在编写这个巨大的脚本 其中多次引用这两个数据库 问题是这种数据迁移目前正在开发中 在某些时候我将需要在生产中使用两个不同的数据库来完成它 而不是像这样直接引用数
  • 如何制作带有圆角的 tkinter 画布矩形?

    我想创建一个带圆角的矩形 我正在使用 tkinter 的画布 为托比亚斯的方法提供另一种方法确实是用一个多边形来实现 如果您担心优化 或者不必担心引用单个对象的标签系统 那么这将具有成为一个画布对象的优点 该代码有点长 但非常基本 因为它只
  • Android webview:像浏览器一样下载文件

    我正在开发一个 Android 应用程序 其 webview 指向另一个团队的动态网站 当我下载文件时 主要是动态重定向PDF 和 ZIP 我得到的只是下载文件夹中的一个文件 其中包含一些 HTML 代码 其中包含诸如 用户不允许读取该文件
  • [fn] 与 [(fn, u8)] 之间的 Rust 差异

    为什么会这样编译 fn main let xs 1 2 3 but 才不是 fn main let xs 1 1 2 2 3 3 编辑 要明确的是 问题不是为什么它不编译 It is 这两个之间有什么区别 第一个可以编译 但第二个却不能 第
  • GCC“人工”函数属性的用例

    我刚刚读到 GCC 函数属性artificial但不太明白描述 你能给我一些有用的例子吗 另一个答案没有错 但也许我可以解释得更好一些 想象一下这个函数foo c 带有行号 10 static inline int foo struct q
  • Google Guava:如何使用 ImmutableSortedMap.naturalOrder?

    我正在使用 Google Guava r08 和 JDK 1 6 0 23 我想创建一个ImmutableSortedMap使用构建器 我知道我可以像这样创建构建器 ImmutableSortedMap Builder
  • authlib OAuth 客户端与 Flask 应用程序一起使用的更好示例?

    我已经在我的 Flask 应用程序中使用了密码和代码授予流程 但这一切都感觉有点笨拙 我发现使用fetch token and update token在 oauth register 中处理令牌超时非常令人困惑 并且我没有找到错误处理的示
  • PagedList 和异步

    我在视图中使用 PagedList 但我的脚手架控制器是使用这种默认索引操作生成的 public async Task
  • 如何从jar文件访问资源文件[重复]

    这个问题在这里已经有答案了 我读过很多类似的帖子 但我找不到解决我的问题的方法 我需要验证和解析 xml 文件 针对 xsd 架构进行验证 问题是 在我的方法中 当我运行 mvn package 然后运行 jar 文件时 出现以下错误 ja