Java 在部署与开发期间从JAR文件加载

Java 在部署与开发期间从JAR文件加载,java,deployment,jar,Java,Deployment,Jar,当我将一些数据加载到java程序中时,我通常使用FileInputStream。但是,我将程序部署为jar文件和webstart,因此我必须使用getRessource()或GetResourceAstream()直接从jar文件加载数据 现在总是在开发和部署之间切换代码是很烦人的 有办法解决这个问题吗?i、 有没有办法知道代码是否从jar运行 当我试着用jar加载它时,如下所示: InputStream is = this.getClass().getResourceAsStream("fil

当我将一些数据加载到java程序中时,我通常使用FileInputStream。但是,我将程序部署为jar文件和webstart,因此我必须使用getRessource()或GetResourceAstream()直接从jar文件加载数据

现在总是在开发和部署之间切换代码是很烦人的

有办法解决这个问题吗?i、 有没有办法知道代码是否从jar运行

当我试着用jar加载它时,如下所示:

InputStream is = this.getClass().getResourceAsStream("file.txt");
返回的inputstream仅为null,尽管文件肯定位于应用程序的根目录中


谢谢

为什么在开发过程中使用
FileInputStream
?为什么不从一开始就使用
getResourceAsStream
?只要将文件放在类路径中的适当位置,就不会有任何问题。它仍然可以是本地文件系统中的文件,而不是jar文件中的文件

考虑到最终的部署环境进行开发是很有帮助的

编辑:如果您希望类路径的根目录中有内容,则应使用:

InputStream x = getClass().getResourceAsStream("/file.txt");


基本上
Class.getResourceAsStream
将相对资源解析为包含该类的包
ClassLoader.getResourceAsStream
解析与“根”包相关的所有内容。

您可以始终作为ressource读取数据。您只需将数据所在的路径添加到类路径中

如果您的数据保存在jar文件中的
WEB-INF/somewhere/mydata.txt
,您将通过以下方式访问它:

getClass().getResourceAsStream( "/WEB-INF/somewhere/mydata.txt" )
现在,如果您创建一个开发目录
/devel/WEB-INF/somewhere/mydata.txt
,并将
/devel
放在类路径中,您的代码将在开发和生产中工作

解释问题后编辑:


在您的例子中,
this.getClass().getResourceAsStream(“mydata.txt”)
资源取自
this
类文件的相同位置。如果您想保留这个,那么您必须创建一个目录
/devel//mydata.txt
,然后再次将
/devel
添加到您的类路径中。

如何通过-D开关在您的开发环境中设置一个系统属性?e、 g.java-D:mypropertyname=mypropertyvalue

您可以在您的开发环境中的ant脚本中设置该属性,其他环境无法获得该属性: e、 g


如果某个文件被认为是已部署应用程序的一部分(而不是安装特定文件的一部分),那么您可能会找到一种更好的方法从现有文件中破解它并且可以通过类路径进行定位,然后简单地考虑始终使用GETRealSuffSt流,因为它在实际部署方案中工作,只要它在类路径中。 您还可以从JVM中找到相关的可用信息(如果安全管理器允许):


IHMO,开发和部署之间不应该有任何区别

Classloader.getResource或getResourceAsStream运行良好,您可以读取资源,甚至可以编写资源。您可以编写自己的资源,并以URL/URI的形式访问所有内容,这允许您读取和写入资源,还允许正确识别实际提供资源的人

唯一的问题是,如果已经注册了(在J2EE应用程序中,容器可以安装工厂,而您没有任何方法去安装自己的工厂),并且您不能在“任何地方”使用处理程序

要知道这一点,最好实现自己的“资源”。在那个时候,当我需要它时,我找不到类似的东西,所以我必须实现我自己的ResourceManager。对我来说,访问这样的资源看起来更直观

Resource layout = ResourceManager.resolve("view://layout/main.jsp") 
而不是

URL layout = Classloader.getResource("some_package/view/layout/main.jsp")

因为如果文件在子目录中,只是表明你做得有点错误,那么它似乎不起作用。如果您请求正确的资源,它当然可以与子目录配合使用。请给出一个详细的例子,我们可以帮助你。谢谢。实际上,在开发过程中,文件是根类的上一个目录,因为我的所有类都在“src”中directory@matt:在这种情况下,它不在类路径内。我建议您添加一个“resources”目录并将其添加到类路径中,这样会使事情变得更清楚,并且可能更易于打包部署。谢谢!这是否意味着,使用GetResourceAsStream无法从类路径之外加载文件?
 // Get the location of this class
    Class cls = this.getClass();
    ProtectionDomain pDomain = cls.getProtectionDomain();
    CodeSource cSource = pDomain.getCodeSource();
    URL loc = cSource.getLocation();  // file:/c:/almanac14/examples/
Resource layout = ResourceManager.resolve("view://layout/main.jsp") 
URL layout = Classloader.getResource("some_package/view/layout/main.jsp")