217

In Maven, what does the project.build.directory refer to? I am a bit confused, does it reference the source code directory or the target directory in the Maven project?

Lii
  • 11,553
  • 8
  • 64
  • 88
faisal abdulai
  • 3,739
  • 8
  • 44
  • 66

4 Answers4

269

You can find those maven properties in the super pom.

You find the jar here:

${M2_HOME}/lib/maven-model-builder-3.0.3.jar

Open the jar with 7-zip or some other archiver (or use the jar tool).

Navigate to

org/apache/maven/model

There you'll find the pom-4.0.0.xml.

It contains all those "short cuts":

<project>
    ...
    <build>
        <directory>${project.basedir}/target</directory>
        <outputDirectory>${project.build.directory}/classes</outputDirectory>
        <finalName>${project.artifactId}-${project.version}</finalName>
        <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
        <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
        <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
        <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
        <resources>
            <resource>
                <directory>${project.basedir}/src/main/resources</directory>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>${project.basedir}/src/test/resources</directory>
            </testResource>
        </testResources>
        ...
    </build>
    ...
</project>

Update

After some lobbying I am adding a link to the pom-4.0.0.xml. This allows you to see the properties without opening up the local jar file.

maba
  • 47,113
  • 10
  • 108
  • 118
  • I would suggest an online reference instead of file which is archived into jar. This: http://maven.apache.org/ref/3.0.3/maven-model/maven.html – khmarbaise Nov 13 '12 at 08:38
  • 30
    @khmarbaise Well that's nice as well but it doesn't show you the default value of `project.build.directory` for example. That's what I wanted to show. – maba Nov 13 '12 at 08:59
  • The github mirror allows linking to a specific line number: https://github.com/apache/maven-3/blob/trunk/maven-model-builder/src/main/resources/org/apache/maven/model/pom-4.0.0.xml#L53 Otherwise, it's in svn at: http://svn.apache.org/repos/asf/maven/maven-3/trunk/maven-model-builder/src/main/resources/org/apache/maven/model/pom-4.0.0.xml – Martin Ellis Nov 13 '12 at 10:40
  • @MartinEllis OK, I have updated my answer with a link as well. Thank you! – maba Nov 13 '12 at 10:45
  • I searched the source of the maven repo at https://github.com/apache/maven. A relatively small number of hits (9). Nothing sets that property directly. It's got to be set somewhere! This URL shows the search results I saw: https://github.com/apache/maven/search?p=1&q=%22project.build.directory%22&type=&utf8=%E2%9C%93 – PatS Aug 22 '18 at 16:26
  • False. This is only a subset of project properties from the `POM`. It doesn't include core properties like `project.basedir`, and others. – ingyhere Dec 01 '20 at 17:50
  • Link to doc: https://maven.apache.org/pom.html#the-super-pom which matches https://github.com/apache/maven/blob/master/maven-model-builder/src/main/resources/org/apache/maven/model/pom-4.0.0.xml – SkySpiral7 Aug 17 '23 at 14:23
61

It points to your top level output directory (which by default is target):

https://web.archive.org/web/20150527103929/http://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide

EDIT: As has been pointed out, Codehaus is now sadly defunct. You can find details about these properties from Sonatype here:

http://books.sonatype.com/mvnref-book/reference/resource-filtering-sect-properties.html#resource-filtering-sect-project-properties

If you are ever trying to reference output directories in Maven, you should never use a literal value like target/classes. Instead you should use property references to refer to these directories.

    project.build.sourceDirectory
    project.build.scriptSourceDirectory
    project.build.testSourceDirectory
    project.build.outputDirectory
    project.build.testOutputDirectory
    project.build.directory

sourceDirectory, scriptSourceDirectory, and testSourceDirectory provide access to the source directories for the project. outputDirectory and testOutputDirectory provide access to the directories where Maven is going to put bytecode or other build output. directory refers to the directory which contains all of these output directories.

Gerold Broser
  • 14,080
  • 5
  • 48
  • 107
sdouglass
  • 2,350
  • 16
  • 25
  • 1
    The codehause.org hosting has been terminated and this link does not work any more. – Bartosz Firyn Jun 26 '15 at 09:54
  • Yes, true and sad. I've updated with a working link and quoted the relevant section of the linked page. – sdouglass Jun 26 '15 at 23:19
  • 8
    ...so `project.base.dir` points to the root directory of the project where the pom.xml is. That's why after that, `project.build.directory` defined by Maven is `${project.basedir}/target`. Thanks guys, I didn't know this. – evaldeslacasa Sep 18 '15 at 17:59
  • 1
    Although seems to be true, but how did you get this info: "project.base.dir points to the root directory of the project where the pom.xml is". Where I can see this definition? – qartal May 09 '18 at 20:31
  • 10
    suppose your project is called project-A, and under project-A, a pom.xml is declared, then `${project.build.sourceDirectory}` points to `project-A/src/main/java`, `${project.build.scriptSourceDirectory}` points to `project-A/src/main/scripts`, `${project.build.testSourceDirectory}` points to `project-A/src/test/java`, `${project.build.directory}` points to `project-A/target`, `${project.build.directory}` points to `project-A/target/classes`, `${project.build.testOutputDirectory}` points to `project-A/target/test-classes`. – sc30 Dec 09 '19 at 17:29
  • This is the only complete and accurate answer. – ingyhere Dec 01 '20 at 17:48
  • The comment by sc30, is the most 'to the point' answer. – Ironluca Jan 24 '22 at 15:54
  • @sc30 Please update the 5th property to, `${project.build.outputDirectory}` points to `project-A/target/classes` – Nishanth Jun 02 '23 at 10:25
6

You can find the most up to date answer for the value in your project just execute the

mvn3 help:effective-pom

command and find the <build> ... <directory> tag's value in the result aka in the effective-pom. It will show the value of the Super POM unless you have overwritten.

  • This doesn't show some of the core properties, like `project.basedir`. In other areas it's incomplete, also. – ingyhere Dec 01 '20 at 17:42
  • @ingyhere That is correct, the effective pom does not contain the `project.basedir`. Actually, the reason is that even the super POM doesn't contain. What else do you miss from the effective pom? It sounds interesting to me if you could give some details. – Verhás István Dec 03 '20 at 10:59
1

Aside from @Verhás István answer (which I like), I was expecting a one-liner for the question:

${project.reporting.outputDirectory} resolves to target/site in your project.

papigee
  • 6,401
  • 3
  • 29
  • 31