Установка свойства для того, что maven.compile.classpath содержит БЕЗ Ant

Я хотел бы установить свойство в моем pom на путь к классам, содержащий все зависимости проекта. Плагин ant делает что-то подобное, поэтому я знаю, что это определенно возможно.

Я в основном хочу использовать $ {maven.compile.classpath} везде, где мне нравится, в моем pom, и чтобы он «просто работал». Я не против использовать плагины или что-нибудь еще для этого.

Большое спасибо,

Ник


person Community    schedule 21.04.2009    source источник


Ответы (5)


Я не думаю, что есть способ сделать это без написания собственного плагина maven. Тем не менее, вы можете перейти к пути к классам, используя dependency: build -classpath. Это полезно?

person Dominic Mitchell    schedule 22.04.2009

Начиная с версии 2.7 плагин maven-dependency-plugin теперь может устанавливать свойство для пути к классам. Вот пример:

  <plugin>
      <artifactId>maven-dependency-plugin</artifactId>
      <version>2.8</version>
      <executions>
          <execution>
              <phase>generate-sources</phase>
              <goals>
                  <goal>build-classpath</goal>
              </goals>
              <configuration>
                <outputProperty>maven.compile.classpath</outputProperty>
                <pathSeparator>;</pathSeparator>
              </configuration>
          </execution>
      </executions>
  </plugin>

Если вам нужна поддержка Eclipse, вот мой сайт обновлений:

http://terraframe.github.io/m2e-maven-dependency-plugin/snapshots/

person Ring    schedule 19.08.2013

Вот как это работает:

<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <version>1.7</version>
  <executions>
    <execution>
      <id>define-classpath</id>
      <phase>process-resources</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <exportAntProperties>true</exportAntProperties>
        <target>
          <property name="maven.classpath" refid="maven.runtime.classpath"/>
        </target>
      </configuration>
    </execution>
  </executions>
</plugin>

После его выполнения вы можете использовать свойство ${maven.classpath}.

person yegor256    schedule 17.08.2012
comment
Мне очень нравится это решение, но из-за отсутствия разъема antrun m2e я не могу его использовать. - person Ring; 03.06.2013
comment
Похоже, это не работает с объявлением родительского pom, которое будет использоваться дочерними pom .... - person mmm; 30.12.2017

Я поддерживаю предложение dependency: build-classpath. В настоящее время он не помещает его в свойство, но может быть легко изменен для этого. (патчи приняты)

person Brian Fox    schedule 25.04.2009
comment
stackoverflow .com / questions / 849389 / обсуждает, как загрузить результат как свойство Maven. Вложение в jira.codehaus.org/browse/MCOMPILER-97 предлагает полный пример . - person Jesse Glick; 07.07.2011

Если вам нужно сгенерировать путь к классам как простой список jar-файлов (без полного пути), вы можете реализовать плагин, подобный тому, который показан в примере ниже. Мне нужно добавить путь к классам в манифесте, используя свойство, отличное от «Class-Path», потому что я использую такой инструмент, как Eclipse «JarRsrcLoader» (он похож на One-JAR), и я хочу создать Manifest.MF следующим образом:

Manifest-Version: 1.0
Rsrc-Class-Path: ./ ssm-core-0.0.1-SNAPSHOT.jar commons-codec-1.9.jar 
 commons-io-2.4.jar ehcache-2.8.3.jar spring-beans-4.0.5.RELEASE.jar s
 sm-standalone-cryptlayer-0.0.1-SNAPSHOT.jar shiro-core-1.2.3.jar comm
 ons-beanutils-1.8.3.jar bcprov-jdk15on-1.50.jar javacsv-2.0.jar ssm-f
 ile-persistence-0.0.1-SNAPSHOT.jar spring-context-4.0.5.RELEASE.jar s
 pring-aop-4.0.5.RELEASE.jar aopalliance-1.0.jar spring-core-4.0.5.REL
 EASE.jar commons-logging-1.1.3.jar spring-expression-4.0.5.RELEASE.ja
 r slf4j-log4j12-1.7.7.jar slf4j-api-1.7.7.jar log4j-1.2.17.jar
Built-By: ctasso
Build-Jdk: 1.7.0_10
Class-Path: .

Итак, я определил плагин Maven следующим образом:

public void execute() throws MojoExecutionException, MojoFailureException {
        try {


            MavenArchiver mavenArchiver = new MavenArchiver();

            ManifestConfiguration config = new ManifestConfiguration();
            config.setAddClasspath(true);
            Manifest manifest = mavenArchiver.getManifest(project, config);


            String classPath = manifest.getMainAttributes().getValue("Class-Path");

            getLog().debug(String.format("Setting the classpath property %s to %s",classpathVarName,classPath));

            project.getProperties().put(classpathVarName, classPath);

        } catch (DependencyResolutionRequiredException e) {
            throw new MojoFailureException(e.getMessage());
        } catch (ManifestException e) {
            throw new MojoFailureException(e.getMessage());
        }

    }

Используя этот плагин, вы можете определить свойство, которое содержит список jar-файлов пути к классам:

<plugin>
    <groupId>it.cineca.plugins</groupId>
    <artifactId>classpath-maven-plugin</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <executions>
        <execution>
            <id>set-classpath</id>
            <phase>package</phase>
            <goals>
                <goal>setcp</goal>
            </goals>
            <configuration>
                <classpathVarName>cineca.classpath</classpathVarName>
            </configuration>
        </execution>
    </executions>   
</plugin>

и используйте это свойство где угодно, например, для создания своего собственного Manifest.MF:

<archive>
     <manifestEntries>
        <Rsrc-Class-Path>./ ${cineca.classpath}</Rsrc-Class-Path>
        <Class-Path>.</Class-Path>
        <Rsrc-Main-Class>it.cineca.cpd.starter.TestStarter</Rsrc-Main-Class>
        <Main-Class>org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader</Main-Class>
     </manifestEntries>
</archive>
person Claudio Tasso    schedule 27.06.2014