为什么项目布局资源与 Java 源代码分开?

2022-09-02 09:01:42

为什么 maven 将资源保存在与 Java 源代码不同的“源文件夹”中?

根据我的经验,在Java中,资源文件大多被视为Java源文件,当“编译”时,只需要与类一起按原样复制,并最终打包在jar中,并由类加载器的方法/访问,通过.getResourcegetResourceAsStreamclasspath

就个人而言,我发现将资源文件与Java源代码分开是一种无用的复杂性。

  1. 你觉得怎么样?
  2. Maven 将资源与源代码分开,这有充分的理由吗?
  3. 在不使用和保留资源以及使用maven方面是否有任何反指示?src/main/resourcessrc/test/resourcessrc/main/javasrc/test/java

答案 1

还有一点还没有提出来,那就是你显然习惯于看到只有java源代码的项目。但是,如果您输入其他一些源文件类型,我认为组织更有意义,例如:

  • src/main
    • 资源
    • 爪哇岛
    • 槽的

每个子目录都有特定的文件分类:

  • java ->编译为java文件的东西
  • 时髦 - >编译为时髦脚本的东西
  • 资源 - >未编译的数据用于任何...(此外,可以对这些信息进行过滤以添加编译时信息)

另外(正如我在一些评论中已经指出的那样),我通常不会使资源目录扁平化。文件可以嵌套到类似包的结构中,也可以适当地嵌套到其他子目录中(根据我的组织感)。


答案 2

为了简单和更容易访问,我们还在java源代码路径中保留了一些资源。这使得我们在GUI级别上作为速度模板进行开发非常方便,并且这些模板接近控制器Java代码。但是你必须告诉maven包含非java的东西,这些东西在src/main/java中,方法是在你的pom文件中添加这样的东西。

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.1.1</version>
                <configuration>
                <webResources>
                    <resource>
                        <directory>src/main/java</directory>
                        <targetPath>WEB-INF/classes</targetPath>
                      <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                        <include>**/*.htm</include>
                        <include>**/*.html</include>
                        <include>**/*.css</include>
                        <include>**/*.js</include>
                      </includes>
                    </resource>
                    <resource>
                        <directory>src/main/resources</directory>
                      <excludes>
                        <exclude>**/log4j.xml</exclude>
                      </excludes>
                    </resource>
                </webResources>
                </configuration>
            </plugin>