无法在pom.xml文件从Web应用程序读取

问题描述:

所以我的tomcat的webapps目录下是这样的:无法在pom.xml文件从Web应用程序读取

C:/tomcat/webapps/myApp/ 
myApp/ 
    resources/... 
META-INF/ 
    MANIFEST.MF 
    maven/ 
     my.package.name/ 
      myApp/ 
       pom.properties 
       pom.xml 
WEB-INF/ 
    classes/... 
    lib/... 
    web.xml 

我有一个AppConfig.java(Java Spring配置),我想获得的POM。 XML文件,所以我可以从中得到某些东西。我已经尝试了很多东西,但在获取文件方面没有成功。我有一个bean,我刚刚已经把一个断点,并尝试不同的东西来获取文件。

@Bean 
    public String clientVersion() 
    { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(ClassLoader.class.getResourceAsStream("/pom.xml"))); 

     return ""; 
    } 

我曾尝试ClassLoader.class.getResourceAsStream()与许多不同的路径,虽然从我已经能够在其他帖子和论坛上找到ClassLoader.class.getResourceAsStream("META-INF/maven/my.package.name/myApp/pom.xml")应该工作,但我得到空不管我做什么。有什么建议么?

+0

尝试了这一点 - META-INF/maven的/我/包/对myApp/pom.xml的。请删除您的目录名称中的小圆点和正斜杠 – Keerthivasan

要加载资源,您必须提供完整路径,而不仅仅是文件名。例如/maven/mypackage/myapp/pom.xml 尝试打开藏匿处。

+0

我尝试了这个建议,它没有工作。我在另一个SO中读到,ClassLoader并不关心主导斜线。我无法找到更早的地方。 –

更改代码:

@Bean 
public String clientVersion() 
{ 
    BufferedReader reader = new BufferedReader(new InputStreamReader(ClassLoader.class.getResourceAsStream("/META-INF/maven/my.package.name/myApp/pom.xml"))); 

    return ""; 
} 

取决于它是如何存储你的文件系统,该my.package.name可能需要实际上是my/package/name

+0

实际的目录名是带点的,而不是斜杠,但我仍然尝试过,它没有工作。 –

+0

也许这就是问题所在? – Antoniossss

+0

尝试在'/ WEB-INF/classes'下放置'/ META-INF/** ... ... – carlspring

请不要使用ClassLoader类,因为您可能拾取了错误的类加载器(令人困惑,对吧?!)。 取而代之的是使用my.package.name.MyClass.class.getResourceAsStream("/META-INF/maven/my.package.name/myApp/pom.xml")));,这样就可以确保两个文件(类和pom.xml)对于同一个类加载器都可用,因为它们在同一个存档中。

我这样做是为了把它作为一个String(被称为ServerResource.java类,所以换入你的类名内):

InputStream is = ServerResource.class.getResourceAsStream("/META-INF/maven/org.buffalo/platform/pom.xml"); 
String pom = getStringFromInputStream(is); 

,如果你提取你的战争/罐,可以确认的路径(对我来说,它是META-INF/maven/org.buffalo/platform_ws/pom.xml)

Class::getResourceAsStream从类路径加载资源;在Web应用程序中,这意味着在WEB-INF/classes内的文件,或者在WEB-INF/lib内部的JAR文件之一内。你的POM文件不在这些地方,所以它不在类路径中。

确切地说,在WAR根目录下的某个地方,它是一个web资源,而不是一个classpath资源。您可以使用ServletContext::getResourceAsStream加载网络资源。

您的代码应该是这样的:

@Bean 
public String clientVersion(ServletContext servletContext) throws IOException { 
    String pomPath = "/META-INF/maven/my.package.name/myApp/pom.xml"; 
    try (InputStream pomStream = servletContext.getResourceAsStream(pomPath)) { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(pomStream)); 
     return ""; 
    } 
}