如何在maven多模块应用程序中查找资源路径

时间:2016-08-30 03:55:26

标签: java maven resources

我有一个多模块maven应用程序,它具有以下结构:

main-project
      ->submodule1
         ->src->main
            ->java
               ->MainClass.java
            ->resource
               ->php
                    index11.php
                    file12.php
                    file13.php
      ->submodule2
         ->src->main
            ->java
               MainClass.java
         ->resource
           ->php
                index21.php
                file22.php
                file23.php
     ->submodule3
        ->src->main
           ->java
               MainClass.java
           ->resource
              ->php
                  index31.php
                  file32.php
                  file33.php
     ->web-app
       ->src->main
            ->webapp  

子模块中的Java类应该访问其资源目录中的php文件,并使用Quercus Resin执行它。但是,当项目打包在战争中时,子模块被打包到jar文件中,这些文件存储在web-app / WEB-INF / lib中,这使得无法执行php文件。作为解决此问题的方法,我找到了将子模块中的所有php文件复制到web-app的解决方案,因此当它在Tomcat中解压缩时,它不在jar文件中并且可以执行。为此,我使用maven-remote-resources-plugin,所有php文件都存储到web-app / src / main / webapp / php。

我现在遇到的问题是如何从子模块内的java类中正确提供这些php文件的路径。当应用程序部署到Tomcat时,这些java类在jar文件中,但在开发过程中我使用的是嵌入式Jetty服务器,所以我需要能够在两种情况下都有效的解决方案。

如果我使用类加载器获取资源,例如。 getClass()。getClassLoader()。getResource(“/ php / index11.php”)。getPath()它返回submodule1.jar文件的绝对路径。

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我设法解决了这个问题,所以我会在这里发布解决方案,如果它可以帮助其他人。

在每个子模块中,我都有一个maven-remote-resources-plugin包来收集我需要的所有资源

 <build>
    <plugins>
        <plugin>
            <artifactId>maven-remote-resources-plugin</artifactId>
            <version>1.5</version>
            <executions>
                <execution>
                    <goals>
                        <goal>bundle</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <includes>
                    <include>**/*.php</include>
                </includes>
            </configuration>
        </plugin>
    </plugins>
</build>

然后,在web-app子模块中,我使用maven-remote-resources-plugin进程将这些php文件复制到名为WEB-INF / php / submodule-name的资源目录

<plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-remote-resources-plugin</artifactId>
      <version>1.5</version>
      <configuration>
          <resourceBundles>
              <resourceBundle>org.au.morph.offline:morph-sample:${project.version}</resourceBundle>
              <resourceBundle>org.au.morph.offline:morph-project:${project.version}</resourceBundle>
          </resourceBundles>
          <outputDirectory>src/main/webapp/WEB-INF</outputDirectory>
      </configuration>
      <executions>
          <execution>
              <goals>
                  <goal>process</goal>
              </goals>
          </execution>
      </executions>
  </plugin>

最后,我创建了一个实用程序方法,当我从IDE或Tomcat运行应用程序时,它解析了该目录的正确路径:

    public static String getWebContentPath(String contextPath) throws UnsupportedEncodingException {

    String path = PathUtils.class.getClassLoader().getResource("").getPath();
    String fullPath = URLDecoder.decode(path, "UTF-8");
    if(fullPath.contains("/WEB-INF/classes")){
        String pathArr[] = fullPath.split("/classes/");
        fullPath=pathArr[0];
    }
    String reponsePath = "";
    reponsePath = new File(fullPath).getPath() + File.separatorChar + "php"+File.separatorChar+contextPath;
    return reponsePath;
}