我有一个多模块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文件的绝对路径。
知道如何解决这个问题吗?
答案 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;
}