target folder vs local repository
Solution 1
They are completely different and shouldn't be mixed up.
target
represents the build directory. This is to say, every temporary file that is generated during the build from the sources ends up there. Quite notably, you'll find the compiled classes of the main and test Java sources, but you'll also find lots of things in there (generated source files, filtered files, etc.). What matters, is that everything that is contained in this folder is inherently temporary. You can delete it at any time, runningmvn clean
, and be assured that the next build will (or at least should) work just fine. All the files and folders generated undertarget
serve a single purpose: create the artifacts of the project. A Maven project, for example withjar
packaging, will have a single main artifact, which is composed of its final name with ajar
extension, and will contain the compiled Java classes. The final name can be a custom name, set within the POM, or the default one derived from the Maven coordinates of the project. Such a project can also have additional attached artifacts, like a test JAR, or a sources JAR.The local repository only contains the artifacts. There are no temporary files in there. What is installed when running
mvn install
is strictly the generated artifacts of the Maven project, i.e. the end products, plus the POM file of the project. Everything that served to create them isn't put in the local repository, and the build of a project must never put temporary things in there. Keep in mind that the local repository is a Maven repository, and, as such, follows a strict naming scheme: a project with a group id ofmy.groupid
, an artifact id ofmy-artifactid
and a version of1.0
will get installed in the foldermy/groupid/my-artifactid/1.0
; in which you'll find the POM file, and all the other artifacts. The name of the artifacts themselves cannot be overriden: it will bemy-artifactid-1.0.jar
for a JAR project (perhaps with a classifier added).
This is generally a source of confusion: the name of the main artifact file that is generated under the target
folder is completely distinct from the name that it will have in the local repository when installed, or in remote repositories when deployed. The first can be controlled, but the latter is defined by the naming scheme of the repository, which is calculated from the coordinates.
To recap: target
contains all the gory temporary details during the build which creates the artifacts of a project (main JAR, sources, Javadoc... i.e. everything that is supposed to be deployed and released by that project), while the local repository (and remote repositories) will contain only the artifacts themselves.
Solution 2
Not much in terms of the generated module.jar
if that's what you are really concern about. The .jar generated is the same, also considering recompiling the code would clean your /target
folder but not the .m2
one.
Though /target
folder would generally be composed of the compiled source classes /target/classes
and /target/generated-source
etc along with a module.jar
.
On the other hand the local ~.m2/repository
would consist of module.jar
along with the pom.xml
for that module and all the configs(repositories
, dependencies
etc) to rebuild that module from if required.
Related videos on Youtube
Johan
Updated on June 04, 2022Comments
-
Johan almost 2 years
I know that Maven houses the outcome of the build in the local repository (artifacts goes installed under
~/.m2/repository/
), but it also outputs the compiled classes in thetarget
folder next tosrc
.Is there any difference between what goes in the local repository and what goes in the
target
folder? -
joe over 4 yearsCould you provide some examples about what the "local repository" would contain? "the local repository (and remote repositories) will contain only the artifacts themselves." Does this mean that if I have a java project called test, the "local repository" would contain test.jar?