设置类路径

内容

将类路径条目添加到清单

[顶部]

Maven Archiver 可以将项目的类路径添加到清单中。这是通过<addClasspath>配置元素完成的。

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        ...
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
            </manifest>
          </archive>
        </configuration>
        ...
      </plugin>
    </plugins>
  </build>
  ...
  <dependencies>
    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>2.1</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.plexus</groupId>
      <artifactId>plexus-utils</artifactId>
      <version>1.1</version>
    </dependency>
  </dependencies>
  ...
</project>

使用上述配置生成的清单如下所示:

Manifest-Version: 1.0
Created-By: Apache Maven ${maven.version}
Build-Jdk: ${java.version}
Class-Path: plexus-utils-1.1.jar commons-lang-2.1.jar

使Jar 可执行

[顶部]

如果要创建可执行的 jar 文件,则需要相应地配置 Maven Archiver。你需要告诉它使用哪个主类。这是通过<mainClass>配置元素完成的。pom.xml这是一个配置为添加类路径并将该类fully.qualified.MainClass用作主类的示例:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        ...
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <mainClass>fully.qualified.MainClass</mainClass>
            </manifest>
          </archive>
        </configuration>
        ...
      </plugin>
    </plugins>
  </build>
  ...
  <dependencies>
    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>2.1</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.plexus</groupId>
      <artifactId>plexus-utils</artifactId>
      <version>1.1</version>
    </dependency>
  </dependencies>
  ...
</project>

使用上述配置生成的清单如下所示:

Manifest-Version: 1.0
Created-By: Apache Maven ${maven.version}
Build-Jdk: ${java.version}
Main-Class: fully.qualified.MainClass
Class-Path: plexus-utils-1.1.jar commons-lang-2.1.jar

改变类路径:定义类路径目录前缀

[顶部]

有时能够更改类路径很有用,例如在创建瘦 war-files时。这可以通过<classpathPrefix>配置元素来实现。

<project>
  ...
  <build>
    <plugins>
      <plugin>
         <artifactId>maven-war-plugin</artifactId>
         <configuration>
           <archive>
             <manifest>
               <addClasspath>true</addClasspath>
               <classpathPrefix>lib/</classpathPrefix>
             </manifest>
           </archive>
         </configuration>
      </plugin>
    </plugins>
  </build>
  ...
  <dependencies>
    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>2.1</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.plexus</groupId>
      <artifactId>plexus-utils</artifactId>
      <version>1.1</version>
    </dependency>
  </dependencies>
  ...
</project>

使用上述配置生成的清单类路径如下所示:

Class-Path: lib/plexus-utils-1.1.jar lib/commons-lang-2.1.jar

更改类路径:使用 Maven存储库-样式类路径

[顶部]

(自:2.3,见下文)

有时,您可能希望在存档中包含 Maven 存储库样式的目录结构。如果您希望在清单类路径中引用这些目录中的依赖存档,请尝试使用<classpathLayoutType>值为 的元素'repository',如下所示:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <classpathPrefix>lib/</classpathPrefix>
              <classpathLayoutType>repository</classpathLayoutType>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
  <dependencies>
    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>2.1</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.plexus</groupId>
      <artifactId>plexus-utils</artifactId>
      <version>1.1</version>
    </dependency>
  </dependencies>
  ...
</project>

使用上述配置生成的清单类路径如下所示:

Class-Path: lib/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar lib/commons-lang/commons-lang/2.1/commons-lang-2.1.jar

更改类路径:使用自定义类路径格式

[顶部]

(自:2.4)

有时,您可能在自己的存档中拥有自定义格式的依赖存档,它不符合上述任何类路径布局。如果您希望在存档的清单类路径中为依赖存档定义自定义布局,请尝试使用<classpathLayoutType>值为 的元素'custom'以及<customClasspathLayout>元素,如下所示:

<project>
  ...
  <build>
    <plugins>
      <plugin>
         <artifactId>maven-war-plugin</artifactId>
         <configuration>
           <archive>
             <manifest>
               <addClasspath>true</addClasspath>
               <classpathLayoutType>custom</classpathLayoutType>
               <customClasspathLayout>WEB-INF/lib/$${artifact.groupIdPath}/$${artifact.artifactId}-$${artifact.version}$${dashClassifier?}.$${artifact.extension}</customClasspathLayout>
             </manifest>
           </archive>
         </configuration>
      </plugin>
    </plugins>
  </build>
  ...
  <dependencies>
    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>2.1</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.plexus</groupId>
      <artifactId>plexus-utils</artifactId>
      <version>1.1</version>
    </dependency>
  </dependencies>
  ...
</project>

这个类路径布局比前面的例子更复杂一些。要了解如何<customClasspathLayout>解释配置的值,了解解析值中的表达式时应用的规则很有用:

  1. 如果存在,去掉前缀“artifact”。从表达式。
  2. 尝试使用反射将表达式解析为对 Artifact 的引用(例如,'artifactId'成为对方法的引用'getArtifactId()')。
  3. 尝试将表达式解析为对当前 Artifact 的 ArtifactHandler 的引用,再次使用反射(例如,'extension'成为对方法的引用'getExtension()')。
  4. 尝试将表达式解析为特殊情况 Properties 实例中的键,该实例包含以下映射:
    • 'dashClassifier': 如果 Artifact 有分类器,则为 ,否则为空字符串。'-$artifact.classifier'
    • 'dashClassifier?': 这是的同义词'dashClassifier'
    • 'groupIdPath': 这相当于, 所有字符都替换为.'$artifact.groupId''.''/'

使用上述配置生成的清单类路径如下所示:

Class-Path: WEB-INF/lib/org/codehaus/plexus/plexus-utils-1.1.jar WEB-INF/lib/commons-lang/commons-lang-2.1.jar

处理快照版本

[顶部]

(从 2.4 开始)

根据您构建存档的方式,您可能能够指定快照依赖存档是否包含在版本后缀'-SNAPSHOT'中,或者是否使用该存档的唯一时间戳和内部版本号。例如,Assembly Plugin允许您在其> 描述符部分的<outputFileNameMapping>元素中做出此决定。<dependencySet

在使用简单(默认)或存储库类路径布局时强制使用 -SNAPSHOT 版本

要强制使用'-SNAPSHOT'版本命名,只需禁用<useUniqueVersions>配置元素,如下所示:

<useUniqueVersions>false</useUniqueVersions>

强制使用带有自定义布局的 -SNAPSHOT 版本

要强制使用'-SNAPSHOT'版本命名,只需在上面的自定义布局示例中替换为,如下所示:'$artifact.version''$artifact.baseVersion'

<customClasspathLayout>WEB-INF/lib/${artifact.groupIdPath}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</customClasspathLayout>

完整的示例配置如下所示:

<project>
  ...
  <build>
    <plugins>
      <plugin>
         <artifactId>maven-war-plugin</artifactId>
         <configuration>
           <archive>
             <manifest>
               <addClasspath>true</addClasspath>
               <classpathLayoutType>custom</classpathLayoutType>
               <customClasspathLayout>WEB-INF/lib/${artifact.groupIdPath}/${artifact.artifactId}-${artifact.version}${dashClassifier?}.${artifact.extension}</customClasspathLayout>
             </manifest>
           </archive>
         </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>