eclipse:在jar导出中包含abitrary文件

时间:2012-01-13 19:31:48

标签: java eclipse build jar executable-jar

我有一个我希望包含在我的jar中的任意文件的目录 - 但是,我无法找到一种方法,可以使用export - > “Runnable jar”。我已经尝试了将目录设为'源路径'的技巧,但是当我构建jar时它仍然不存在。我意识到我可以手动将它们添加到jar中(毕竟它只是一个zip) - 或者我可以使用ant脚本或其他构建系统 - 但我正在寻找适用于不合适的东西的东西Eclipse Eclipse“Java项目”。

这是一个例子。我想尝试加载log4j.properties(如果存在)。如果没有,我想从我的jar文件中包含的'default'中写出来。最后,如果失败,则加载默认值。

请注意,我不知道下面的代码是否有效,可能需要调整。我不是在寻求帮助,我只是为我想做的事情提供背景。

        // initialize logging libraries
    File log4jFile = new File("log4j.properties");
    if (log4jFile.exists() & log4jFile.canRead()) {
        PropertyConfigurator.configure(log4jFile.getAbsolutePath());
    }
    else {
        try {
            InputStream log4jJarstream = Main.class.getResourceAsStream(sepd + "resources" + sep + "log4j.properties");
            OutputStream outStream = new FileOutputStream(new File("log4j.properties"));
            int read = 0;
            byte[] bytes = new byte[1024];

            while ((read = log4jJarstream.read(bytes)) != -1) {
                outStream.write(bytes, 0, read);
            }
            log4jJarstream.close();
            outStream.flush();
            outStream.close();
        }
        catch (Exception e) {
            BasicConfigurator.configure();
            log.warn("Error writing log4j.properties, falling back to defaults.");
        }
    }

3 个答案:

答案 0 :(得分:1)

我将log4j.properties添加到我的src文件夹,并将jar导出为runnable。它奏效了。

答案 1 :(得分:0)

只需尝试导出 - > JAR文件而不是导出 Runnable JAR文件:它允许您选择要包含在生成的存档中的多个资源。

您也可以指定 Main-Class 属性,就像后一个选项一样。

顺便说一下,如果你使用某种构建工具(比如Ant <jar> targetMaven Jar plugin)会更方便。如果使用Eclipse生成JAR文件,还可以选择保存可以在以后为您执行任务的Ant构建文件。

答案 2 :(得分:0)

在将文件作为资源加载的代码中出现错误...它似乎是Eclipse“看到”,因此拒绝打包文件。我将文件放在类文件的旁边,并改变了我搜索文件的方式,并将其与.class文件打包在一起,并且能够在执行期间读取。新的代码段:

// initialize logging libraries
    File log4jFile = new File("log4j.properties");
    if (log4jFile.exists() & log4jFile.canRead()) {
        PropertyConfigurator.configure("log4j.properties");
    }
    else {
        try {
            InputStream log4jJarstream = Main.class.getResourceAsStream("log4j.properties");
            OutputStream outStream = new FileOutputStream(new File("log4j.properties"));
            int read = 0;
            byte[] bytes = new byte[1024];

            while ((read = log4jJarstream.read(bytes)) != -1) {
                outStream.write(bytes, 0, read);
            }
            log4jJarstream.close();
            outStream.flush();
            outStream.close();

            PropertyConfigurator.configure("log4j.properties");
        }
        catch (Exception e) {
            BasicConfigurator.configure();
            log.warn("Error writing log4j.properties, falling back to defaults.");
            log.warn(e);
            log.warn("STACK TRACE:");
            int i = 0;
            StackTraceElement[] trace = e.getStackTrace();
            while (i < trace.length) {
                log.warn(trace[i]);
                i++;
            }
        }
    }