为啥我需要将目标文件夹设置为源文件夹?第一次没有创建“目标”时项目是如何编译的?

Posted

技术标签:

【中文标题】为啥我需要将目标文件夹设置为源文件夹?第一次没有创建“目标”时项目是如何编译的?【英文标题】:Why do I need to set target folder as source folder? How was the project compiled for the first time when "target" wasn't cretaed?为什么我需要将目标文件夹设置为源文件夹?第一次没有创建“目标”时项目是如何编译的? 【发布时间】:2015-01-04 22:29:00 【问题描述】:

我有一个现有的 maven 项目(使用的 IDE:Sprint 测试工具),我提供的帮助非常有限。我是 maven、java 和其他东西的新手(我知道基本的 java 并且已经在 java 中完成了自动化,但还没有从事过成熟的 java 项目),我必须自己或多或少地弄清楚我们所有的这个项目。 我试图编译包,但它在 main\src\java 中显示错误,即“无法解析消息”这种代码:Messages.. 我搜索了文件夹,发现只有一个 Messages.java 文件(包含该方法定义)在项目的“目标”文件夹的子文件夹中。因此,我被要求将此子文件夹的路径/文件夹添加为源文件夹,并且错误消失了。

我相信在编译/打包 maven 项目时会创建整个“目标”。并且,将路径添加到源文件夹会索引该路径并使其可用于编译/打包。所以,我想知道项目最初是如何编译和打包的。 我确实在 src\main\resources\folders..\Messages.properties 中看到 Messages.properties,Messages.java 中定义的方法似乎与此属性文件有某种关系。

我在网上搜索但找不到答案。请问stack可以帮我吗? 提前致谢。

【问题讨论】:

请提供您的 pom.xml 文件的 部分。您是正确的,作为一般规则,目标/目录由 Maven 生成以存储构建输出,因此不应成为您构建的依赖项。 【参考方案1】:

您提供的信息有些稀疏,因此如果您可以提供 pom.xml 文件的 sn-p 会有所帮助 - 特别是 <plugins> 部分,以及顶层项目的目录结构,尤其是这个Messages 文件的位置。

target 目录是由 Maven 动态创建的,用于存储构建的输出是正确的,因此其内容中的任何内容都不应该是构建的依赖项。

最可能的情况是您的构建在compile 阶段之前运行了某种代码生成器(可能是Ant 任务或某些Maven 插件),这就是生成Messages.java 文件的原因依赖。

假设生成了Messages.java,那么解决方案是将其放在src/main/gen/ 目录中,并将该目录添加到您的构建路径(并删除目标)。

清理选项:可能不可能

如果您能确定是哪个插件创建了Messages.java,并且可以修改其输出路径,那么这是最简单的选择——将其重新配置为写入src/main/gen/ 而不是target/

肮脏但可靠的选择

可能出于某种原因,上述方法不可行。然后在你的 pom 文件中的pre-compile 阶段简单地将Messages.java 文件从target/ 复制到src/main/gen/

<plugin>
    <groupId>mojo.codehaus.org</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.3.2</version>
    <configuration>
        <executable>cp</executable>
        <arguments>
            <argument>target/Messages.java</argument>
            <argument>src/main/gen/Messages.java</argument>
        </arguments>
    </configuration>
</plugin>

希望对您有所帮助。

【讨论】:

以上是关于为啥我需要将目标文件夹设置为源文件夹?第一次没有创建“目标”时项目是如何编译的?的主要内容,如果未能解决你的问题,请参考以下文章

从不同的源文件夹在一个文件夹中创建目标文件

苹果电脑如何设置文件不允许删除

目标文件夹和源文件夹相同

为啥需要将配置文件设置为用于调试和发布的分发?

如何在一个批处理文件中从一个源文件夹执行两个 ROBOCOPY 语句到两个目标文件夹?

利用python实现两个文件夹的同步