我正在学习Maven,尽管过去曾经使用过Ant。
我正在试图弄清楚当执行命令mvn install或mvn compile
时会发生什么。我主要感兴趣的是项目构建的方式,例如挑选用于构建的资源位置以及构建后放置它们的位置。
我的项目源代码结构如下:
src > main > java > java files
src > main > resources > reources like spring config atc
src > main > webapp > static files like js,css etc
src > main > webapp > WEB-INF > web.xml and jsp files
当我执行mvn package或mvn clean命令时,我会看到下面这个名为myProject的目录(这是我的重点),以及其他文件,如war包和classes等。myProject目录的结构如下:
1) All files from (src > main > webapp) including WEB-INF gets copied under myProject
2) All files from (src > main > resources) gets copied under myProject > WEB-INF/Classes
3) All files from (src > main > java) gets copied under myProject > WEB-INF/Classes
根据我的理解,当我们执行mvn install或mvn compile或mvn package时,所有编译阶段都会被执行。但我的问题是,Maven如何知道在exploded目录下放置源文件?这是Maven遵循的标准吗?
以下是我使用的pom.xml代码片段作为参考:
<artifactId>myProject</artifactId>
<packaging>war</packaging>
<name>myProject</name>
.....
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>exploded</goal>
</goals>
</execution>
</executions>
<configuration>
<overlays>
</overlays>
</configuration>
</plugin>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>yuicompressor-maven-plugin</artifactId>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jslint</goal>
<goal>compress</goal>
</goals>
</execution>
</executions>
<configuration>
<aggregations>
</aggregations>
</configuration>
</plugin>
</plugins>
</build>
WEB-INF/lib/META-INF/resources
上,而是在位于WEB-INF/lib中的JAR文件的META-INF/resources上。这并不完全相同,你错过了JAR文件。对于第二个问题,规范只是指定了应该如何访问它。即使你的servlet可以访问WEB-INF/classes下的所有内容,你也应该使用这些方法,否则在打包应用程序(例如war或ear)后会遇到问题。 - alain.janinmnew File()
访问图像或使用InputStream读取文件,则无法正常工作,因为图像/文件不在文件系统中,而是在war或ear中。因此,您必须使用这些方法来访问它们。这个答案很好地解释了getResource()的含义:https://dev59.com/h2Yq5IYBdhLWcg3w7E0F#14089228 - alain.janinm