如何在 Maven 中指定额外的源/资源文件夹,以便 IDE 知道它们?

Posted

技术标签:

【中文标题】如何在 Maven 中指定额外的源/资源文件夹,以便 IDE 知道它们?【英文标题】:How to specify in Maven extra source/resource folders so IDEs are aware of them? 【发布时间】:2014-10-19 13:13:34 【问题描述】:

我是一个 Maven 初学者,经过反复试验,我设法为发布 WAR 指定了与开发 WAR 相关的不同属性文件(我尝试以我能想到的最简单的方式来做,但是随意提出任何更简单的解决方案)。

因此,在开发过程中,我的database.propertieslog4j.properties 来自src/main/resources,而在生成发布WAR 时它们来自src/main/resources/release

到目前为止,一切都很好。

问题是:因为我正在使用 Eclipse,有没有办法说,在 POM 中,src/main/resources/release 也是一个源文件夹,以便 Eclipse 将它列在其他源文件夹下在项目资源管理器中,即使其他开发人员在他的 IDE 中导入项目(即没有手动将该文件夹添加为源文件夹)?

这是我的 POM 的相关部分:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
...
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <war-name>/</war-name>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
                ...
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            ...
        </plugin>

        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            ...
        </plugin>
    </plugins>
</build>

<dependencies> ... </dependencies>

<profiles>
    <profile>
        <id>release</id>
        <properties>
            <war-name>ROOT</war-name>
        </properties>

        <build>
            <resources><!-- Replace Maven default resources directory (this could probably be achieved with a property)-->
                <resource>
                    <filtering>true</filtering>
                    <directory>$basedir/src/main/resources/release</directory>
                    <includes>
                        <include>*</include>
                    </includes>
                </resource>
            </resources>
        </build>
    </profile>
</profiles>

【问题讨论】:

【参考方案1】:
<build>  
   ...  
   < sourceDirectory > src/main/java </ sourceDirectory >  
   < testSourceDirectory > src/test/java </ testSourceDirectory >  
   < resources >  
       < resource >  
          < directory > src/main/resources </ directory >  
       </ resource >  
   </ resources >  
   < testResources >  
       < testResource >  
          < directory > src/test/resources </ directory >  
       </ testResource >  
   </ testResources >  
   ...  
</build>  

【讨论】:

这就是我替换资源目录以使 Maven 拾取发布文件的方式,所以我想这不是我想要的。我希望 Maven 声明一个额外的 source 文件夹,以便 IDE 将它与项目资源管理器中的正确图标一起列出。我将发布我的 POM 相关部分以使其清楚。 build-helper-maven-plugin 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post。 虽然我一开始并没有发现这个答案有用,但它给了我一个想法。正如@Jehof 指出的那样,如果您对其进行编辑以包含更好的解释,我会接受它。 经过彻底测试,我发现在配置文件中指定资源文件夹(这是我从您的回答中得到的想法)不起作用。我在自己的答案中发布了解决方案。不过感谢您的帮助。【参考方案2】:

您可以指定 eclipse 应该在其中运行 maven 的配置文件...

右键单击项目,选择 Maven,并包含您可以在 eclipse 下工作的配置文件。

当您更改配置文件后,当您执行 maven 更新项目(即 eclipse 应该识别新的源文件夹)时,您的配置应该被 eclipse 拾取。

【讨论】:

谢谢,但正如您在发布的 POM 中看到的那样,我已经知道配置文件。关键是我需要告诉 Maven 在开发时使用一些资源,在发布时使用其他一些资源,但在 IDE 中我希望看到所有这些资源。然而,@secret32 给了我一个很好的解决方案。 然后在 eclipse 中用两个配置文件配置项目...? 作为一个先决条件,我不想改变 Eclipse 项目配置,我喜欢保持简单(最重要的是对于可能加入开发的其他人),所以如果可以避免一个步骤,我宁愿避免它。我刚刚发布了我找到的解决方案作为答案。谢谢你的建议。【参考方案3】:

这就是我的做法。

基本上,我在默认配置中声明了我想在 Eclipse 中看到的所有资源文件夹(将它们添加到每个配置文件中都不起作用,因为当配置文件处于活动状态时, 节点将附加到最终 POM而不是(如我所想)替换现有的);然后我告诉 Maven 使用属性从哪个文件夹复制资源,属性的值是活动配置文件的驱动程序。

当然,非常感谢任何评论!

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
    <packaging>war</packaging>
    <name>...</name>

    <!-- My prerequisite was that when working in Eclipse no extra steps 
         should be required to make the IDE use the right configuration than
         Configure -> Convert to Maven Project, so I didn't like having 
         default settings in a profile that must be enabled in Eclipse project
         configuration -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <war-name>/</war-name>

        <!-- These solve the problem: AFAICT, each <resource /> is added to the final POM,
             so declaring a resources folder in a profile didn't exclude other resources 
             folders declared in the default (i.e. without profiles active) configuration.
             So, the solution is to change what Maven brings in from each folder depending
             on the profile currently active. What follows is the default, no-profile
             active configuration. -->
        <res.devel.includes>**/*</res.devel.includes>
        <res.devel.excludes></res.devel.excludes>

        <res.local.includes></res.local.includes>
        <res.local.excludes>*</res.local.excludes>

        <res.release.includes></res.release.includes>
        <res.release.excludes>*</res.release.excludes>
    </properties>

    <build>
        <resources><!-- Here I declare all the resources folders, so that they will all be shown in Eclipse. Property values drive what is included and excluded. -->
            <resource><!-- This is the default Maven main resource directory -->
                <directory>$basedir/src/main/resources-local</directory>
                <filtering>true</filtering>
                <includes>
                    <include>$res.devel.includes</include>
                </includes>

                <excludes>
                    <exclude>$res.devel.excludes</exclude>
                </excludes>
            </resource>

            <resource><!-- This is the resources directory for when the WAR is deployed on a local standalone Tomcan installation (useful for web pages editing) -->
                <directory>$basedir/src/main/resources-local</directory>
                <filtering>true</filtering>
                <includes>
                    <include>$res.local.includes</include>
                </includes>

                <excludes>
                    <exclude>$res.local.excludes</exclude>
                </excludes>
            </resource>

            <resource><!-- This is the resource directory for when the WAR will be deployed -->
                <directory>$basedir/src/main/resources-release</directory>
                <filtering>true</filtering>
                <includes>
                    <include>$res.release.includes</include>
                </includes>

                <excludes>
                    <exclude>$res.release.excludes</exclude>
                </excludes>
            </resource>
        </resources>

        <plugins>
            <!-- Plugins configurations -->
        </plugins>
    </build>

    <dependencies>
        <!-- Dependencies declarations -->
    </dependencies>

    <profiles><!-- Here are the profiles. When working in Eclipse no profile is active, so the resources will be taken only from src/main/resources (as per default properties values). -->
        <profile>
            <id>local</id><!-- This is for when the WAR is deployed on a local standalone Tomcat instance (i.e. outside of Eclipse) -->
            <properties>
                <war-name>ROOT</war-name>

                <!-- The resources will be taken only from src/main/resources-local -->
                <res.devel.includes></res.devel.includes>
                <res.devel.excludes>*</res.devel.excludes>

                <res.local.includes>*</res.local.includes>
                <res.local.excludes></res.local.excludes>

                <res.release.includes></res.release.includes>
                <res.release.excludes>*</res.release.excludes>
            </properties>
        </profile>

        <profile>
            <id>release</id><!-- This is for when the WAR is deployed on the production server -->
            <properties>
                <war-name>ROOT</war-name>

                <!-- The resources will be taken only from src/main/resources-release -->
                <res.devel.includes></res.devel.includes>
                <res.devel.excludes>*</res.devel.excludes>

                <res.local.includes></res.local.includes>
                <res.local.excludes>*</res.local.excludes>

                <res.release.includes>*</res.release.includes>
                <res.release.excludes></res.release.excludes>
            </properties>
        </profile>
    </profiles>
</project>

【讨论】:

以上是关于如何在 Maven 中指定额外的源/资源文件夹,以便 IDE 知道它们?的主要内容,如果未能解决你的问题,请参考以下文章

获取附加到 Eclipse 的源 jar 文件以获取 Maven 管理的依赖项

晨曦软件如何输入模板和脚手架的定额

如何在 Spring Maven WAR 中指定 SQLite db 文件的位置

定额转清单|快速导出XML文件(下)

如何在 QML 的 .qrc 资源文件中指定通配符?

如何让 .exe 打包的 Ruby Shoes 应用程序引用包外的资源?