'src/main/java''约定的优点是什么?

Chr*_*ris 49 java coding-style conventions

我注意到很多项目都有以下结构:

  • 项目-A
    • 箱子
    • LIB
    • SRC
      • 主要
        • java的
          • RootLevelPackageClass.java

我目前使用以下约定(因为我的项目是100%java):

  • 项目-A
    • 箱子
    • LIB
    • SRC
      • RootLevelPackageClass.java

我目前没有使用Maven,但我想知道这是否是Maven约定或者是否还有其他原因.有人可以解释为什么第一个版本如此受欢迎,如果我应该采用这个新的约定?

克里斯

Bor*_*vić 55

主要好处是将test目录作为子目录,src具有与以下目录结构相同的目录结构main:

  • 项目-A
    • 箱子
    • LIB
    • SRC
      • 主要
        • java的
          • RootLevelPackageClass.java
        • 资源
      • 测试
        • java的
          • TestRootLevelPackageClass.java
        • 资源

所有包私有方法RootLevelPackageClass都是可见的,即可以测试TestRootLevelPackageClass.由于测试代码也是源代码,因此它应该位于src目录下.

  • 通常资源目录也分为`src/main/resources`和`src/test/resources`. (3认同)
  • 此外,如果您的项目使用多种语言,它们可以很好地位于src/main /和src/test结构中.您可以使用src/main/groovy,src/main/kotlin,src/main/jython等.JVM现在除了Java之外还有许多其他语言. (2认同)

Pét*_*rök 23

是的,这是Maven的惯例.

即使您的项目是100%Java(与Maven btw一样),您经常拥有资源文件(src/main/resources根据Maven惯例)或Web应用程序内容,或者......所有这些都很容易适应Maven系统.

如果您对当前的构建系统(无论它是什么)感到满意,则没有理由切换到Maven.否则,或者如果开始一个新项目,您可以评估您的选项,包括Maven.


Esk*_*sko 13

其他人已经告诉过你这是一个Maven会议,我将回答你的问题:

绝对没有.当然,将代码片段分开来分离根文件夹是有益的,但通常你也可以实现相同的目的

  • [根]
    • SRC
      • com.org.net
        • 你的班
    • 测试
      • com.org.net
        • YourTest.class
    • LIB
    • 箱子
    • 资源

代替.事实上,这是Maven做的一件大事,实际上是非常错误的:它想要将二进制内容添加到源代码存储库,这仅用于文本内容!所有二进制内容都应在源代码存储库之外进行管理,其中包括Web应用程序中的图像等等.

但是好吧,我们假设你已经决定住在有点臭的Maven生态系统中; 那么你当然应该尽可能严格遵守Maven惯例.

  • 尽管名称不同,源代码repos也适用于二进制文本内容和文本内容.也许您的项目不依赖于二进制资产,但我最近的(Web)项目都有视觉(或听觉),如果没有它们,它们将无法运行.它们是项目的组成部分.让它们与"代码"一起进行版本化是非常有益的.不包括它们只会让每个人的工作变得更难. (9认同)
  • ..你对二进制内容的"正确"版本是什么意思?我在过去20年中使用的每个系统都允许我签入二进制文件.当然,CVS有点挑剔,但是现在git是完美的 - 事实上,git将所有内容视为二进制blob(至少在存储层).我/我们失踪了什么? (4认同)
  • 嗯,这是我多年来的另一件旧事,我甚至不同意我自己在这一点上:)我想,答案会变老. (2认同)

sou*_*els 9

它是一个Maven会议.

Maven基于约定优于配置范例.这意味着:如果您不遵循此约定,则必须配置源所在的位置.这是恕我直言的主要好处.

  • 你是对的.但是,如果你不使用/ src/main/java作为你的源文件夹,你的pom.xml将有十亿和一行:-) (6认同)
  • 他们*说*Maven是基于约定优于配置,但为什么是`pom.xml`:数十亿行很长,一般来说这些复杂的XML是什么......?:) (4认同)
  • @Esko 我认为你错了......然后。这是_约定优于配置_。这不是 _**no** 配置而不是配置_。我认为 POM 的声明性而非命令性本质是一个纯粹的天才概念。XML 很冗长,同意。但是有了它,内容很容易理解和理解。我们很久以前就开始避免使用像 `a`、`a1`、`a2`、`x`、`y`、`z` 这样的标识符,不是吗? (2认同)

ndp*_*ndp 5

是的,这是一个 Maven 约定,但即使您不使用 Maven,使用它也有好处:

  1. 新接触该项目的人会更容易上手,因为它是一个“标准”
  2. 这个约定很灵活,可以容纳非 Java 代码和其他您目前没有的东西。这是它受欢迎的原因之一,您可能会发现它比您自己想出的方案更好
  3. 如果你想在某个时候迁移到 Maven,那会很容易

虽然我不认为你应该只是为了切换而切换,但在开始一个新项目时,确实没有理由不使用它——除非你在哲学上不同意它如何分解代码。