繁体   English   中英

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

[英]loading from JAR files during deployment vs development

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

现在总是在开发和部署之间切换这段代码很烦人吗?

有这种方法吗? 即有没有办法知道代码是否从jar运行?

当我尝试像这样加载它时:

InputStream is = this.getClass().getResourceAsStream("file.txt");

返回的输入流只是null,尽管该文件肯定在应用程序的根目录中。

谢谢!

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

在考虑最终部署环境的情况下开发是有帮助的。

编辑:如果你想在类路径的目录中有东西,你应该使用:

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

要么

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

基本上Class.getResourceAsStream将解析包含该类的包的相对资源; ClassLoader.getResourceAsStream解析相对于“root”包的所有内容。

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

如果您的数据保留在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/<path of package>/mydata.txt并再次添加/devel到你的类路径。

如何通过-D开关在开发环境中设置系统属性? 例如java -D:mypropertyname = mypropertyvalue

您可以在开发环境中的ant脚本中设置属性,其他环境不会获取属性:例如

public static boolean isDevEnvironment(){ return System.getProperty("mypropertyname")!=null;}

您可能会从现有的系统属性中找到一种更好的方法来破解它

如果文件被认为是已部署应用程序的一部分(而不是安装特定文件的一部分)并且可以通过类路径定位,那么请考虑简单地始终使用getResourceAsStream,因为无论实际部署方案如何,只要它在类路径。

您可能还会发现JVM提供的相关信息(如果安全管理员允许):

 // 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/

http://www.exampledepot.com/egs/java.lang/ClassOrigin.html?l=rel

开发与部署,IHMO之间应该没有任何区别。

Classloader.getResource或getResourceAsStream运行良好,您可以读取资源甚至编写它们。您可以编写自己的协议句柄并将所有内容作为URL / URI访问,这样您就可以读取和写入资源,并且可以正确识别实际提供的人员资源。

唯一的问题是如果URLStreamHandlerFactory已经注册(在J2EE应用程序中,容器可以安装工厂而你没有任何方法可以自行安装)并且你无法在任何地方使用你的处理程序。

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

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

代替

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM