{"id":94,"date":"2014-11-23T14:23:01","date_gmt":"2014-11-23T06:23:01","guid":{"rendered":"http:\/\/vinta.ws\/code\/?p=94"},"modified":"2026-02-18T01:20:37","modified_gmt":"2026-02-17T17:20:37","slug":"maven-java-build-tool","status":"publish","type":"post","link":"https:\/\/vinta.ws\/code\/maven-java-build-tool.html","title":{"rendered":"Maven: The De Facto Build Tool for JVM Projects"},"content":{"rendered":"<h2>Install<\/h2>\n<pre class=\"line-numbers\"><code class=\"language-bash\"># on Mac OS X\n$ brew install maven\n$ brew install maven-completion<\/code><\/pre>\n<p>ref:<br \/>\n<a href=\"https:\/\/maven.apache.org\/index.html\">https:\/\/maven.apache.org\/index.html<\/a><\/p>\n<h2>Commands<\/h2>\n<pre class=\"line-numbers\"><code class=\"language-bash\"># create project: interactive mode\n$ mvn archetype:generate \n-DarchetypeArtifactId=maven-archetype-quickstart \n-DinteractiveMode=true\n\n# create project: non-interactive mode\n$ mvn archetype:generate \n-DarchetypeArtifactId=maven-archetype-quickstart \n-DinteractiveMode=false \n-DgroupId=ws.vinta.pangu \n-DartifactId=pangu\n\n# download dependencies\n$ mvn dependency:copy-dependencies\n\n# download dependencies to a specific directory\n$ mvn dependency:copy-dependencies -DoutputDirectory=jars\n\n# analyze unused dependencies\n$ mvn dependency:analyze\n\n$ mvn compile\n\n$ mvn test\n\n# run a specific class\n$ mvn exec:java -Dexec.mainClass=\"pangu_example.App\"\n\n# package a JAR\n$ mvn package\n\n# \u63d0\u4ea4\u5230 central repository \u4e4b\u524d\u53ef\u4ee5\u7528\u9019\u500b\u4f86\u6e2c\u8a66\u4e00\u4e0b\u5b89\u88dd\u6709\u6c92\u6709\u554f\u984c\n$ mvn clean install<\/code><\/pre>\n<p>build lifecycle<br \/>\n<a href=\"http:\/\/openhome.cc\/Gossip\/JUnit\/BuildLifeCycle.html\">http:\/\/openhome.cc\/Gossip\/JUnit\/BuildLifeCycle.html<\/a><\/p>\n<ul>\n<li><code>src\/main\/java<\/code> \u653e\u7f6e\u5c08\u6848\u539f\u59cb\u78bc<\/li>\n<li><code>src\/test\/java<\/code> \u653e\u7f6e\u55ae\u5143\u6e2c\u8a66\u7528\u539f\u59cb\u78bc<\/li>\n<li><code>src\/main\/resources<\/code> \u653e\u7f6e\u8a2d\u5b9a\u6a94\uff0c\u4f8b\u5982 log4j.properties<\/li>\n<li><code>src\/test\/resources<\/code> \u653e\u7f6e\u6e2c\u8a66\u7528\u8a2d\u5b9a\u6a94\uff0c\u5982\u540c\u6e2c\u8a66\u7a0b\u5f0f\u672c\u8eab\u4e0d\u6703\u88ab\u6253\u5305\u9032 jar<\/li>\n<\/ul>\n<h2>Configuration<\/h2>\n<p>in pom.xml<\/p>\n<p>\u653e per project \u7684\u8a2d\u5b9a<\/p>\n<pre class=\"line-numbers\"><code class=\"language-xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0http:\/\/maven.apache.org\/maven-v4_0_0.xsd\"&gt;\n  &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n  &lt;parent&gt;\n    &lt;groupId&gt;org.sonatype.oss&lt;\/groupId&gt;\n    &lt;artifactId&gt;oss-parent&lt;\/artifactId&gt;\n    &lt;version&gt;7&lt;\/version&gt;\n  &lt;\/parent&gt;\n  &lt;groupId&gt;ws.vinta&lt;\/groupId&gt;\n  &lt;artifactId&gt;pangu&lt;\/artifactId&gt;\n  &lt;version&gt;1.0.1-SNAPSHOT&lt;\/version&gt;\n  &lt;packaging&gt;jar&lt;\/packaging&gt;\n  &lt;name&gt;Pangu&lt;\/name&gt;\n  &lt;description&gt;Paranoid text spacing for good readability, to insert whitespace between CJK (Chinese, Japanese, Korean), half-width English, digit and symbol characters automatically.&lt;\/description&gt;\n  &lt;url&gt;https:\/\/github.com\/vinta\/pangu.java&lt;\/url&gt;\n  &lt;inceptionYear&gt;2014&lt;\/inceptionYear&gt;\n  &lt;licenses&gt;\n    &lt;license&gt;\n      &lt;name&gt;MIT License&lt;\/name&gt;\n      &lt;url&gt;http:\/\/www.opensource.org\/licenses\/mit-license.php&lt;\/url&gt;\n      &lt;distribution&gt;repo&lt;\/distribution&gt;\n    &lt;\/license&gt;\n  &lt;\/licenses&gt;\n  &lt;developers&gt;\n    &lt;developer&gt;\n      &lt;id&gt;vinta&lt;\/id&gt;\n      &lt;name&gt;Vinta&lt;\/name&gt;\n      &lt;email&gt;vinta.chen@gmail.com&lt;\/email&gt;\n      &lt;url&gt;http:\/\/vinta.ws\/&lt;\/url&gt;\n    &lt;\/developer&gt;\n  &lt;\/developers&gt;\n  &lt;scm&gt;\n    &lt;connection&gt;scm:git:git@github.com:vinta\/pangu.java.git&lt;\/connection&gt;\n    &lt;developerConnection&gt;scm:git:git@github.com:vinta\/pangu.java.git&lt;\/developerConnection&gt;\n    &lt;url&gt;git@github.com:vinta\/pangu.java.git&lt;\/url&gt;\n    &lt;tag&gt;HEAD&lt;\/tag&gt;\n  &lt;\/scm&gt;\n  &lt;issueManagement&gt;\n    &lt;system&gt;GitHub Issues&lt;\/system&gt;\n    &lt;url&gt;https:\/\/github.com\/vinta\/pangu.java\/issues&lt;\/url&gt;\n  &lt;\/issueManagement&gt;\n  &lt;properties&gt;\n    &lt;project.build.sourceEncoding&gt;UTF-8&lt;\/project.build.sourceEncoding&gt;\n  &lt;\/properties&gt;\n  &lt;dependencies&gt;\n    &lt;dependency&gt;\n      &lt;groupId&gt;junit&lt;\/groupId&gt;\n      &lt;artifactId&gt;junit&lt;\/artifactId&gt;\n      &lt;version&gt;4.11&lt;\/version&gt;\n      &lt;scope&gt;test&lt;\/scope&gt;\n    &lt;\/dependency&gt;\n  &lt;\/dependencies&gt;\n  &lt;distributionManagement&gt;\n    &lt;snapshotRepository&gt;\n      &lt;id&gt;ossrh&lt;\/id&gt;\n      &lt;url&gt;https:\/\/oss.sonatype.org\/content\/repositories\/snapshots&lt;\/url&gt;\n    &lt;\/snapshotRepository&gt;\n    &lt;repository&gt;\n      &lt;id&gt;ossrh&lt;\/id&gt;\n      &lt;url&gt;https:\/\/oss.sonatype.org\/service\/local\/staging\/deploy\/maven2\/&lt;\/url&gt;\n    &lt;\/repository&gt;\n  &lt;\/distributionManagement&gt;\n  &lt;profiles&gt;\n    &lt;profile&gt;\n      &lt;id&gt;release&lt;\/id&gt;\n      &lt;build&gt;\n        &lt;plugins&gt;\n          &lt;plugin&gt;\n            &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n            &lt;artifactId&gt;maven-gpg-plugin&lt;\/artifactId&gt;\n            &lt;version&gt;1.5&lt;\/version&gt;\n            &lt;executions&gt;\n              &lt;execution&gt;\n                &lt;id&gt;sign-artifacts&lt;\/id&gt;\n                &lt;phase&gt;verify&lt;\/phase&gt;\n                &lt;goals&gt;\n                  &lt;goal&gt;sign&lt;\/goal&gt;\n                &lt;\/goals&gt;\n              &lt;\/execution&gt;\n            &lt;\/executions&gt;\n          &lt;\/plugin&gt;\n        &lt;\/plugins&gt;\n      &lt;\/build&gt;\n    &lt;\/profile&gt;\n  &lt;\/profiles&gt;\n  &lt;build&gt;\n    &lt;plugins&gt;\n      &lt;plugin&gt;\n        &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n        &lt;artifactId&gt;maven-compiler-plugin&lt;\/artifactId&gt;\n        &lt;version&gt;3.2&lt;\/version&gt;\n        &lt;configuration&gt;\n          &lt;source&gt;${maven.compile.source}&lt;\/source&gt;\n          &lt;target&gt;${maven.compile.target}&lt;\/target&gt;\n          &lt;optimize&gt;${maven.compile.optimize}&lt;\/optimize&gt;\n          &lt;encoding&gt;UTF8&lt;\/encoding&gt;\n        &lt;\/configuration&gt;\n      &lt;\/plugin&gt;\n      &lt;plugin&gt;\n        &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n        &lt;artifactId&gt;maven-source-plugin&lt;\/artifactId&gt;\n        &lt;version&gt;2.4&lt;\/version&gt;\n        &lt;executions&gt;\n          &lt;execution&gt;\n            &lt;id&gt;attach-sources&lt;\/id&gt;\n            &lt;goals&gt;\n              &lt;goal&gt;jar-no-fork&lt;\/goal&gt;\n            &lt;\/goals&gt;\n          &lt;\/execution&gt;\n        &lt;\/executions&gt;\n      &lt;\/plugin&gt;\n      &lt;plugin&gt;\n        &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n        &lt;artifactId&gt;maven-javadoc-plugin&lt;\/artifactId&gt;\n        &lt;version&gt;2.10.1&lt;\/version&gt;\n        &lt;executions&gt;\n          &lt;execution&gt;\n            &lt;id&gt;attach-javadocs&lt;\/id&gt;\n            &lt;goals&gt;\n              &lt;goal&gt;jar&lt;\/goal&gt;\n            &lt;\/goals&gt;\n          &lt;\/execution&gt;\n        &lt;\/executions&gt;\n      &lt;\/plugin&gt;\n      &lt;plugin&gt;\n        &lt;groupId&gt;org.sonatype.plugins&lt;\/groupId&gt;\n        &lt;artifactId&gt;nexus-staging-maven-plugin&lt;\/artifactId&gt;\n        &lt;version&gt;1.6.5&lt;\/version&gt;\n        &lt;extensions&gt;true&lt;\/extensions&gt;\n        &lt;configuration&gt;\n          &lt;serverId&gt;ossrh&lt;\/serverId&gt;\n          &lt;nexusUrl&gt;https:\/\/oss.sonatype.org\/&lt;\/nexusUrl&gt;\n          &lt;autoReleaseAfterClose&gt;true&lt;\/autoReleaseAfterClose&gt;\n        &lt;\/configuration&gt;\n      &lt;\/plugin&gt;\n      &lt;plugin&gt;\n        &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n        &lt;artifactId&gt;maven-release-plugin&lt;\/artifactId&gt;\n        &lt;version&gt;2.5.1&lt;\/version&gt;\n        &lt;configuration&gt;\n          &lt;autoVersionSubmodules&gt;true&lt;\/autoVersionSubmodules&gt;\n          &lt;useReleaseProfile&gt;false&lt;\/useReleaseProfile&gt;\n          &lt;releaseProfiles&gt;release&lt;\/releaseProfiles&gt;\n          &lt;goals&gt;deploy&lt;\/goals&gt;\n        &lt;\/configuration&gt;\n      &lt;\/plugin&gt;\n    &lt;\/plugins&gt;\n  &lt;\/build&gt;\n&lt;\/project&gt;<\/code><\/pre>\n<p>ref:<br \/>\n<a href=\"http:\/\/maven.apache.org\/pom.html\">http:\/\/maven.apache.org\/pom.html<\/a><br \/>\n<a href=\"https:\/\/github.com\/vinta\/pangu.java\/blob\/master\/pom.xml\">https:\/\/github.com\/vinta\/pangu.java\/blob\/master\/pom.xml<\/a><\/p>\n<p>Maven \u7684 groupId \u57fa\u672c\u4e0a\u53ea\u662f\u7528\u4f86\u6a19\u793a\u9019\u500b artifact \u5c6c\u65bc\u54ea\u4e00\u500b group<br \/>\n\u57fa\u672c\u4e0a\u5c31\u662f\u7528\u4f60\u7684 domain name \u5c31\u597d\u4e86<br \/>\n\u8ddf Java \u7684 package \u8def\u5f91\u6c92\u6709\u95dc\u4fc2<\/p>\n<p>in settings.xml<\/p>\n<pre class=\"line-numbers\"><code class=\"language-xml\">\u653e global \u7684\u8a2d\u5b9a<\/code><\/pre>\n<p>ref:<br \/>\n<a href=\"http:\/\/maven.apache.org\/ref\/3.2.3\/maven-settings\/settings.html\">http:\/\/maven.apache.org\/ref\/3.2.3\/maven-settings\/settings.html<\/a><\/p>\n<h3>maven-source-plugin<\/h3>\n<h3>maven-javadoc-plugin<\/h3>\n<p>How to attach source and javadoc artifacts?<br \/>\n<a href=\"http:\/\/maven.apache.org\/plugin-developers\/cookbook\/attach-source-javadoc-artifacts.html\">http:\/\/maven.apache.org\/plugin-developers\/cookbook\/attach-source-javadoc-artifacts.html<\/a><\/p>\n<pre class=\"line-numbers\"><code class=\"language-bash\">$ mvn source:jar\n$ mvn javadoc:jar\n# or\n$ mvn package<\/code><\/pre>\n<h2>Find packages<\/h2>\n<p>ref:<br \/>\n<a href=\"https:\/\/search.maven.org\/\">https:\/\/search.maven.org\/<\/a><br \/>\n<a href=\"https:\/\/mvnrepository.com\/\">https:\/\/mvnrepository.com\/<\/a><\/p>\n<h2>Issues<\/h2>\n<h3>\u4e2d\u6587\u6703\u662f\u4e82\u78bc<\/h3>\n<pre class=\"line-numbers\"><code class=\"language-xml\">&lt;project&gt;\n  &lt;properties&gt;\n    &lt;project.build.sourceEncoding&gt;UTF-8&lt;\/project.build.sourceEncoding&gt;\n  &lt;\/properties&gt;\n&lt;\/project&gt;<\/code><\/pre>\n<p>ref:<br \/>\n<a href=\"http:\/\/maven.apache.org\/general.html#encoding-warning\">http:\/\/maven.apache.org\/general.html#encoding-warning<\/a><\/p>\n<h3>\u65b0\u589e\u984d\u5916\u7684 Maven Repositories<\/h3>\n<p>in pom.xml<\/p>\n<pre class=\"line-numbers\"><code class=\"language-xml\">&lt;project&gt;\n    &lt;repositories&gt;\n        &lt;repository&gt;\n            &lt;id&gt;spark-packages&lt;\/id&gt;\n            &lt;name&gt;Spark Packages Repository&lt;\/name&gt;\n            &lt;url&gt;https:\/\/dl.bintray.com\/spark-packages\/maven\/&lt;\/url&gt;\n        &lt;\/repository&gt;\n    &lt;\/repositories&gt;\n&lt;\/project&gt;<\/code><\/pre>\n<p>ref:<br \/>\n<a href=\"https:\/\/maven.apache.org\/guides\/mini\/guide-multiple-repositories.html\">https:\/\/maven.apache.org\/guides\/mini\/guide-multiple-repositories.html<\/a><\/p>\n<h3>\u5141\u8a31\u4e0b\u8f09 SNAPSHOT \u7248\u672c\u7684 libraries<\/h3>\n<p>in ~\/.m2\/settings.xml<\/p>\n<pre class=\"line-numbers\"><code class=\"language-xml\">&lt;settings&gt;\n  &lt;profiles&gt;\n    &lt;profile&gt;\n      &lt;id&gt;allow-snapshots&lt;\/id&gt;\n      &lt;activation&gt;\n        &lt;activeByDefault&gt;true&lt;\/activeByDefault&gt;\n      &lt;\/activation&gt;\n      &lt;repositories&gt;\n        &lt;repository&gt;\n          &lt;id&gt;ossrh-snapshots-repo&lt;\/id&gt;\n          &lt;url&gt;https:\/\/oss.sonatype.org\/content\/repositories\/snapshots&lt;\/url&gt;\n          &lt;releases&gt;\n            &lt;enabled&gt;false&lt;\/enabled&gt;\n          &lt;\/releases&gt;\n          &lt;snapshots&gt;\n            &lt;enabled&gt;true&lt;\/enabled&gt;\n          &lt;\/snapshots&gt;\n        &lt;\/repository&gt;\n      &lt;\/repositories&gt;\n    &lt;\/profile&gt;\n  &lt;\/profiles&gt;\n&lt;\/settings&gt;<\/code><\/pre>\n<p>\u4f60\u53ef\u4ee5\u65b0\u589e\u591a\u500b snapshots repo \u7684\u4f86\u6e90<\/p>\n<h3>Could not find artifact com.sun:tools:jar<\/h3>\n<p>ref:<br \/>\n<a href=\"http:\/\/maven.apache.org\/general.html#tools-jar-dependency\">http:\/\/maven.apache.org\/general.html#tools-jar-dependency<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Install # on Mac OS X $ brew install maven $ brew install maven-completion ref: https:\/\/maven.apache.org\/index.html Commands # create project: interactive mode $ mvn archetype:generate -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=true # create project: non-interactive mode $ mvn archetype:generate -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -DgroupId=ws.vinta.pangu -DartifactId=pangu # download dependencies $ mvn dependency:copy-dependencies # download dependencies to a specific directory $ mvn dependency:copy-dependencies&hellip; <a href=\"https:\/\/vinta.ws\/code\/maven-java-build-tool.html\" class=\"more-link\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":772,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[39],"tags":[41,42],"class_list":["post-94","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-about-misc","tag-java","tag-maven"],"_links":{"self":[{"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/posts\/94","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/comments?post=94"}],"version-history":[{"count":0,"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/posts\/94\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/media\/772"}],"wp:attachment":[{"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/media?parent=94"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/categories?post=94"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/tags?post=94"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}