当前位置: 首页 > 知识库问答 >
问题:

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

梁建德
2023-03-14

我有一个多模块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执行它。然而,当项目打包在war中时,子模块被打包到存储在web-app/web-inf/lib中的jar文件中,这使得无法执行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个答案

霍伟彦
2023-03-14

我设法解决了这个问题,所以我将在这里张贴解决方案,如果它可能对其他人有所帮助。

在每个子模块中,我都有一个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>
    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;
}
 类似资料:
  • 我有一个Maven Java应用程序,我正在尝试进行对接。到目前为止,我有以下dockerfile,是我从这个答案中复制的。 如果我的应用程序是一个单模块项目,这将是很好的,但是因为它是多模块的,所以我假设我不能仅仅使用。 但是,这会在阶段出错: 注意,来自我的本地m2文件夹。

  • 我使用的是Maven 3.0.3、JUnit 4.8.1和Java1.6。我在JUnit测试文件中有这个... 未拾取“test.properties”(输入流对象为空)。我的项目结构如下: parent+---pom.xml +----war模块 +------pom.xml +------src/test/java/junit文件 +------src/test/resources/test.

  • 我有一个maven多模块项目。其中一个模块(编译为.jar)只包含域对象,这些对象将在客户端和服务器端使用(我将这个.jar添加为我的其他模块的依赖项)。 我知道GWT模块,其中将使用来自共享<代码>的对象。jar还必须有源文件才能成功编译。所以我尝试添加到我的pom中。xml两者: 和 但结果是<代码>。jar不包含GWT模块源代码(即GWT.xml)。也会添加域类的所有源(位于

  • 问题内容: 有什么方法可以在Maven中的父项目的模块之间共享资源?例如,我想为一个多模块Maven项目中的所有模块指定一个log4j.properties文件。 通常,我使用Eclipse IDE通过选择常规项目来创建父项目,然后通过指定的包装将其转换为Maven项目。这将创建一个没有and等文件夹的“干净”项目结构。我不知道在这种情况下应该在哪里放置这样的共享资源。 EDIT1 :我想将公共资

  • 我有一个spring boot mavel多模块项目。 如果Spring启动模块依赖于模块,并且在模块的文件夹中有一个属性文件或其他一些资源,我希望捆绑在最终的Spring启动应用程序中,我如何实现这一点。 目前,如果我在模块A JAR上运行,它包括文件: 然而: 提前感谢您的任何建议。

  • 我有一个包含多个应用程序(不同但密切相关的微服务)的解决方案,这些应用程序共享通用且相当复杂的代码。该项目使用Maven,当前设置为: 我的问题是我想使用开发模式来获取更改,但我无法使其工作。对于单个Quarkus应用程序,它受到支持,并且可以从根文件夹使用quarkus:dev进行构建。对于两个Quarkus应用程序,不清楚启动的是哪一个。 我可以使用Maven的选项来选择我想要启动的那个,但是