如何访问已编译jar中的资源?

时间:2012-07-15 22:07:10

标签: java eclipse jar processing embedded-resource

首先,我读过许多S.O.关于这个主题的问题,我已经尝试了他们建议的事情。

这是我的情况。我正在使用Processing框架编写一个Java应用程序,而我正处于最后阶段,我需要开始考虑打包应用程序。可以从命令行执行的jar文件是我尝试使用Eclipse中的Export功能构建的。

我的项目结构如下:

src/
   multiple packages/
libs/
   jar files and natives
data/
   fonts and images
config/
   json files

当我导出jar文件并用uzip jar来检查它的内容时,我发现这些目录的内容已被转储到.jar的顶层。

看起来像这样:

.jar
    packages
    jar files
    fonts
    json files

所以,当我尝试加载配置文件时,如:

BufferedReader reader = new BufferedReader( new FileReader( path ) );

当我在Eclipse中运行应用程序时,所有内容都可以正常运行。但jar文件会抛出FileNotFoundException

我在S.O.上看过很多问题。关于这些问题建议使用class.getClass().getResource()class.getResourceAsStream()。我已尝试使用相对路径和文件名,如下所示:

class.getResource( 'config.json' );
class.getResources( 'cfg/config.json' );
class.getResourceAsStream( '../../config.json' );

当使用以下命令从Eclipse或jar运行时,所有这些方法都返回null

java -jar myjarfile.jar

我也愿意使用Ant文件。实际上,我现在正在使用导出功能生成的Ant文件来构建jar。如果我可以添加一些内容,将目录添加到jar中,这也很棒。

2 个答案:

答案 0 :(得分:5)

要访问根目录中的资源,请在路径前添加/。如果没有,则相对于当前包执行此操作,这通常仅在资源实际位于源中的类旁边时才有用。

因此,请使用class.getResourceAsStream("/config.json");来访问jar根目录中的config.json。

另请注意,不直接支持jars-inside-jars。

答案 1 :(得分:1)

您的.jar文件应该只包含与编译代码的“包”相关的目录。您可能正在使用/ lib / WEB-INF等引用.war结构,这是不同的。

如果您的包裹结构是:

 com.yourco.authentication

你的课程在登录

那你的罐子应该是

/com/
  /yourco/
    /authentication/
        Login.class

然后,您需要在类路径中使用.jar,以便通过命令行运行env。

我看到你注意到它可以在Eclipse中运行,它可能具有环境设置和导入的必需库等,因此很难确切地说出来。如果你的包/文件夹包含已编译的java代码,我不确定它是否在外部引用时工作,因此建议你在根文件夹中启动你的包。