【问题标题】:Is it necessary to have .java files in /src/main/java when compiling with maven?使用 maven 编译时是否需要在 /src/main/java 中有 .java 文件?
【发布时间】:2010-07-28 15:56:02
【问题描述】:

我试图将一个项目转换为一个 Maven 项目...它的 .java 文件位于 /src/main/java 以外的其他位置,当我运行 maven install 时,所有文件(.hbm,.xml)除外那些 .class 出现在我的 jar 中。

这是来自 pom.xml 的构建部分:

<build>
    <resources>
        <resource>
            <directory>${basedir}/src</directory>
            <excludes>
                <exclude>**/*.java</exclude>
            </excludes> 
        </resource>
    </resources>

    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.5</source>
                <target>1.5</target>
                <fork>true</fork>
                <compilerVersion>1.5</compilerVersion>
                <compilerArguments>
                    <encoding>UTF-8</encoding>
                </compilerArguments>
            </configuration>
        </plugin>
    </plugins>  
</build>

使用上面的代码,.class 文件从我的 jar 中丢失了......并且控制台上没有显示错误消息,是否有必要将它们移动到 /src/main/java 包结构?

另外,这种行为的原因是什么,缺少一些依赖项?

我做了一个改变,将它们移动到 src/main/java 并且我在控制台上遇到了一些异常,但是如果我“必须”将它们添加到这个“src/main/java”结构中,我仍然感到困惑......

请给我一个想法...

谢谢

【问题讨论】:

    标签: java maven-2 layout


    【解决方案1】:

    你可以像这样配置源目录和资源一样:

    <build>
        <sourceDirectory>${basedir}/src</sourceDirectory>
        <resources>
            <resource>
                <directory>${basedir}/src</directory>
                <excludes>
                    <exclude>**/*.java</exclude>
                </excludes>
            </resource>
        </resources>
    </build>
    

    【讨论】:

      【解决方案2】:

      这不是绝对必要的 - 它是可配置的 - 但 Maven 带有 standardized project layout,并且强烈建议像其他 Maven 约定一样接受它(不要与 Maven 对抗,采用它) .

      我了解到您正在从 Ant 迁移到 Maven,但 IMO 并没有走上正确的道路,弯曲 Maven 以使其适合您现有的项目结构/工作流程只是不是推荐的方法:

      1. Maven 强烈建议使用其约定(过度配置)来简化事情。不这样做会使事情变得更加复杂并产生无用的配置开销。
      2. 当偏离默认值时,你有点靠自己。
      3. 不使用默认值可能会导致严重的意外,一些(不良)实现的插件可能使用硬编码路径(如src/main/javatarget/classes 等)并且不喜欢更改默认值。
      4. 等等等等等等。

      推荐的方法是将现有结构转换为兼容 maven 的模块化结构并采用standard Maven layout

      从长远来看,采用 Maven 标准和约定只会让您的 Maven 生活更轻松,并且您会获得一个标准化的结构,而这正是 Maven 所关心的。

      我想有足够多的人写过类似的建议,所以我不会再坚持了。但是您应该听取这些建议(不要坚持尝试使 Maven 适合您现有的结构),尤其是因为您是 Maven 新手。在我看来,您不是从 Ant 迁移到 Maven,而是在尝试将 Maven 迁移到 Ant 构建。

      另见

      【讨论】:

        【解决方案3】:

        看看Super POM。那是您从中获得“公约”的地方。如果您有不同的项目布局,您可能需要更改项目 POM 中的一些设置,但这不是前面提到的好建议。

        【讨论】:

        • 感谢发帖,我会看看...知道如何将默认的“/src/main/java”更改为“/src”,从而将结构重命名为/src/main /java 将不是一个合适的解决方案....
        • ${project.basedir}/src 是改变的地方。
        【解决方案4】:

        到目前为止,最简单的解决方案(如果可能的话)是将代码移动到 /src/main/java,因为这是 maven 所期望的。这是不可能的,你至少需要告诉 maven 在哪里可以找到源代码。从你的 POM 中我看不到你在哪里做的。

        【讨论】:

        • 非常感谢您的发帖,我不知道在 pom.xml 文件中的哪个位置更改默认值,从 src/main/java 到 /src 的源构建现在是如何完成的...我只更改了 "${basedir}/src" ,我认为这还不够:(...
        【解决方案5】:

        如果您想使用 Maven,阻力最小的路径是遵守 Maven 约定。当然你可以有不同的源路径,但肯定更复杂(似乎唯一的方法是pass the source directory as a compiler argument),你有什么收获?我相信移动您的源目录要容易得多。

        【讨论】:

        • 非常感谢您的发帖,我不知道在 pom.xml 文件中的哪个位置更改默认值,从 src/main/java 到 /src 的源构建现在如何完成...我只更改了 "${basedir}/src" ,我认为这还不够:(
        • @user,查看我提供的链接,在那里您可以看到如何将参数直接传递给编译器的示例。不过我还没有尝试过(我更喜欢花时间编写代码 :-)...但是如果您真的想走自己的路,您可以尝试一下。
        猜你喜欢
        • 1970-01-01
        • 2020-12-22
        • 1970-01-01
        • 2017-10-20
        • 1970-01-01
        • 1970-01-01
        • 2014-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多