Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在将路径传递到getResourceAsStream()时包含项目名称?_Java_Maven_Jar_Resources - Fatal编程技术网

Java 如何在将路径传递到getResourceAsStream()时包含项目名称?

Java 如何在将路径传递到getResourceAsStream()时包含项目名称?,java,maven,jar,resources,Java,Maven,Jar,Resources,如何在路径中指定项目以使用getResourceAsStream()访问正确的.properties文件?问题在于子项目A和B中的文件夹和文件名是相等的(因此仅将文件夹/文件指定为路径是不行的。 有类似的解决方案吗 .getResourceAsStream(“/Subproject_B/someFolder/someResourceBundle.properties”)?我是否需要实现自己的类加载器并仅在其类路径上设置要搜索的项目/文件夹?这会导致在加载类似.getResourceAsStrea

如何在路径中指定项目以使用getResourceAsStream()访问正确的.properties文件?问题在于子项目A和B中的文件夹和文件名是相等的(因此仅将文件夹/文件指定为路径是不行的。
有类似的解决方案吗 .getResourceAsStream(“/Subproject_B/someFolder/someResourceBundle.properties”)?我是否需要实现自己的类加载器并仅在其类路径上设置要搜索的项目/文件夹?这会导致在加载类似.getResourceAsStream(“/someFolder/someResourceBundle.properties”)的文件时出现唯一地址

我们的Maven项目如下所示:

SubProject_A
          |-src
            |-main
              |-resources
                |-someFolder                     //folder name is the same as in Subproject_B
                  |-someResourceBundle.properties

SubProject_B
      |-src
        |-main
          |-resources
            |-someFolder                   //folder name is the same as in Subproject_A
              |-someResourceBundle.properties

可以认为这两个资源属于两个坛子。
Class.getResource
特定于该类:

ClassInJarA.class.getResourceAsStream("/...")
系统
ClassLoader
使用指定的完整类路径,使用不带前导斜杠的路径。在第一次匹配时停止

(还要注意,使用
.getClass().getResource
是危险的,因为继承性。)


我会更具体地使用Class.getResourceAsStream。

将每个项目的资源放在一个包中,该包可以根据需要区分资源。例如,
/com/example/project\u a/somePackage/someResourceBundle.properties
/com/example/project\b/somePackage/someResourceBundle.properties
。不需要c如果您以Java方式做事,并通过使用包进行隔离,则使用ustom classloader


使用复杂的乱七八糟的方法来避免故意偏离正常的做事方式通常是一个坏主意。

getResource方法家族是从类路径而不是文件系统工作的。因此,不要考虑文件夹和文件,要考虑包和资源。类路径中应该有
src/main/resources
类路径,因此调用
getResource…()
以访问
someResourceBundle.properties
的参数将是
/someFolder/someResourceBundle.properties
。这显示了一个问题,因为如果您将它们命名为相同的名称,则意味着它们属于同一个模块,或者您的分离错误……“更具体”比什么,以什么方式?@LewBloch不是在整个类路径上,而是在类的jar上。类加载器通常会使用类路径并在第一次匹配时停止。
class\getResource…
“委托给此对象的类加载器”,所以方法是一样的,是吗?@LewBloch:对。通常有几个类加载器,搜索顺序变得有点模糊(对我来说),我会尝试一下。这个类的类加载器应该从它的jar开始。