2009-04-21 35 views
9

Tôi muốn đặt thuộc tính trong pom của tôi thành đường dẫn lớp chứa tất cả các phụ thuộc của dự án. Các plugin kiến ​​làm một cái gì đó như thế này, vì vậy tôi biết nó chắc chắn có thể.Thiết lập thuộc tính cho maven.compile.classpath có chứa KHÔNG Ant

Tôi về cơ bản muốn sử dụng $ {maven.compile.classpath} bất cứ nơi nào tôi thích trong pom của tôi và có nó 'chỉ làm việc'. Tôi không ngại sử dụng plugin hoặc bất kỳ thứ gì khác để đạt được điều này.

Rất cám ơn,

Nick

Trả lời

5

Tôi không nghĩ rằng có một cách để làm điều này mà không cần viết Plugin maven của riêng bạn. Điều đó nói rằng, bạn có thể nhận được ở classpath sử dụng dependency:build-classpath. Là sử dụng?

2

Tôi thứ hai phụ thuộc: đề xuất xây dựng-classpath. Nó sẽ không đặt nó vào một tài sản hiện tại nhưng có thể dễ dàng được sửa đổi để làm như vậy. (Các bản vá lỗi được chấp nhận)

+0

http://stackoverflow.com/questions/849389/how-to-read-an-external-properties-file -in-maven thảo luận cách tải kết quả dưới dạng thuộc tính Maven. Phần đính kèm trong http://jira.codehaus.org/browse/MCOMPILER-97 cung cấp một ví dụ hoàn chỉnh. –

6

Đây là cách hoạt động:

<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> 

Sau khi nó được thực hiện, bạn có thể sử dụng ${maven.classpath} tài sản.

+0

Tôi thích giải pháp này rất nhiều, nhưng vì không có đầu nối m2e antrun tôi không thể sử dụng nó. – Ring

+0

Điều này dường như không làm việc trên khai báo cha mẹ được sử dụng bởi poms con .... – momomo

5

Kể từ phiên bản 2.7, plugin phụ thuộc maven giờ đây có thể đặt thuộc tính cho đường dẫn lớp. Dưới đây là một ví dụ:

<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> 

Nếu bạn muốn hỗ trợ Eclipse đây là trang web cập nhật của tôi:

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

0

Nếu bạn cần phải tạo ra classpath như một danh sách đơn giản của lọ (không có đường dẫn đầy đủ), bạn có thể triển khai một plugin giống như plugin trong ví dụ bên dưới. Nhu cầu của tôi là thêm classpath trong Manifest bằng cách sử dụng một thuộc tính khác với "Class-Path" vì tôi đang sử dụng một công cụ như Eclipse "JarRsrcLoader" (nó tương tự như One-JAR) và tôi muốn tạo một Manifest.MF như sau:

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: . 

Vì vậy, tôi định nghĩa một plugin Maven như thế này:

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()); 
     } 

    } 

Sử dụng plugin này, bạn có thể xác định một tài sản, trong đó có danh sách các lọ của classpath:

<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> 

và sử dụng tài sản này bất cứ nơi nào bạn muốn, ví dụ để tạo MANIFEST.MF tùy chỉnh của bạn:

<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> 
Các vấn đề liên quan