Maven Document翻译——Maven入门指南(下篇)

我如何发布jar到远程仓库?

对于将jar文件发布到外部仓库,你应该在pom.xml中配置url并且在settings.xml中配置连接到仓库的验证信息。 这里是个例子,用scp和用户名/密码验证:

<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.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>Maven Quick Start Archetype</name>
  <url>http://maven.apache.org</url>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.codehaus.plexus</groupId>
      <artifactId>plexus-utils</artifactId>
      <version>1.0.4</version>
    </dependency>
  </dependencies>

  <build>
    <filters>
      <filter>src/main/filters/filters.properties</filter>
    </filters>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
    </resources>
  </build>


  <distributionManagement>
    <repository>
      <id>mycompany-repository</id>
      <name>MyCompany Repository</name>
      <url>scp://repository.mycompany.com/repository/maven2</url>
    </repository>
  </distributionManagement>
</project>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                      http://maven.apache.org/xsd/settings-1.0.0.xsd">
  ...
  <servers>
    <server>
      <id>mycompany-repository</id>
      <username>jvanzyl</username>
      <!-- Default value is ~/.ssh/id_dsa -->
      <privateKey>/path/to/identity</privateKey> (default is ~/.ssh/id_dsa)
      <passphrase>my_key_passphrase</passphrase>
    </server>
  </servers>
  ...
</settings>

现在如果你连接到了匿名登录的openssh ssh服务器,你每次都需要输入你的用户名和密码去验证(尽管你可以利用另外一个ssh客户端去登录)。这种情况你可以利用公钥去登录验证。 假如在settings.xml中有密码这种情况应该注意,了解更多信息,请看密码加密


我如何创建帮助文档?

在创建你的帮助文档之前,你可以利用archetype机制来为你的项目生成一个网站,利用如下命令:

mvn archetype:generate \
  -DarchetypeGroupId=org.apache.maven.archetypes \
  -DarchetypeArtifactId=maven-archetype-site \
  -DgroupId=com.mycompany.app \
  -DartifactId=my-app-site

现在你可以到创建站点指南去学习如何为你的项目创建帮助文档。


我如何构建其他类型的项目?

注意生命周期适用于任何项目类型。比如,回到基本目录我们可以创建一个简单的web应用:

mvn archetype:generate \
    -DarchetypeGroupId=org.apache.maven.archetypes \
    -DarchetypeArtifactId=maven-archetype-webapp \
    -DgroupId=com.mycompany.app \
    -DartifactId=my-webapp

注意这些都必须位于同一行。这将会创建一个目录叫作my-webapp包含如下的项目描述:

<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.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-webapp</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>my-webapp</finalName>
  </build>
</project>

注意<packaging>元素,这个告诉maven打包类型为war,进入webapp的项目目录并且尝试:

mvn clean package

你将会看到target/my-webapp.war被创建,到目前为止,所有的正常步骤都被执行。


我如何同时构建多个项目?

这个概念是说利用Maven构建多个模块。在这节,我们将会展示如何同时构建上述的war包括先前的jar。 首先我们需要一个父pom.xml文件在另外两个的上层目录,例如:

+- pom.xml
+- my-app
| +- pom.xml
| +- src
|   +- main
|     +- java
+- my-webapp
| +- pom.xml
| +- src
|   +- main
|     +- webapp

这个pom文件你将会创建包含如下的:

<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.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <modules>
    <module>my-app</module>
    <module>my-webapp</module>
  </modules>
</project>

jar需要依赖webapp,因此我们向my-webapp/pom.xml添加如下:

...
  <dependencies>
    <dependency>
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-app</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
    ...
  </dependencies>

接着向另外子目录下的pom.xml文件中添加<parent>标签:

<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.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <parent>
    <groupId>com.mycompany.app</groupId>
    <artifactId>app</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  ...

现在在顶层目录尝试运行:

mvn clean install

war文件将会被创建在my-webapp/target/my-webapp.war中,同样jar也会被创建:

$ jar tvf my-webapp/target/my-webapp-1.0-SNAPSHOT.war
   0 Fri Jun 24 10:59:56 EST 2005 META-INF/
 222 Fri Jun 24 10:59:54 EST 2005 META-INF/MANIFEST.MF
   0 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/
   0 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/
   0 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/
3239 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/pom.xml
   0 Fri Jun 24 10:59:56 EST 2005 WEB-INF/
 215 Fri Jun 24 10:59:56 EST 2005 WEB-INF/web.xml
 123 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/pom.properties
  52 Fri Jun 24 10:59:56 EST 2005 index.jsp
   0 Fri Jun 24 10:59:56 EST 2005 WEB-INF/lib/
2713 Fri Jun 24 10:59:56 EST 2005 WEB-INF/lib/my-app-1.0-SNAPSHOT.jar

这个是怎么创建的?首先父pom创建(称作app),有一个packaging和一系列modules定义。这个告诉Maven在项目集合上去运行操作,而不是当前这个(重写这个行为,你可以利用--non-recursive命令) 接着,我们告诉war需要my-app的jar.这个做了一些事情:可以是其在类路径上,war中的其他代码可以找到,保证jar的构建总是先于war的,并且表明war插件将jar包含到它的库目录下。 你可能注意到junit-4.11.jar是一个依赖,但是并没有在war中结束(与生命周期有关,因此用结束来修饰)。原因是<scope>test</scope>原色,这个仅用来测试,并且不会包含在web应用当中。 最后一步是添加parent定义,这个不同于extend元素(maven 1.0):这个保证POM总是可以定位到,即使项目与其双亲是分布式的,以查找仓库的方式。 不想Maven1.0,不需要你运行install去成功执行这些步骤,你可以运行package,可以在target目录中生成,而不会是本地仓库。 你可能喜欢再次生成你的IDEA工作区在顶层目录…

mvn idea:idea



网易云新用户大礼包:https://www.163yun.com/gift

本文来自网易实践者社区,经作者范鹏程授权发布。