2009-05-13 25 views
35

Trong tệp xây dựng bên dưới, mục tiêu jar đề cập đến thuộc tính jar.class.path cho đường dẫn lớp kê khai. Mục tiêu biên dịch tham chiếu đến project.class.pathTạo đường dẫn lớp kê khai từ <classpath> trong Ant

Có sự thừa ở đây, vì jar.class.path và project.class.path rất giống nhau. Chúng phải được cập nhật khi các thư viện được thêm vào, có thể là một nỗi đau nếu danh sách các thư viện rất dài. Có cách nào tốt hơn? Bất kỳ giải pháp nào phải là nền tảng chéo và luôn sử dụng các đường dẫn tương đối.

Chỉnh sửa:
Nó sẽ tạo đường dẫn lớp JAR từ tập dữ liệu chứ không phải theo cách khác, vì vậy tôi có thể sử dụng ký tự đại diện cho ví dụ: bao gồm tất cả các tệp JAR trong một thư mục.

<?xml version="1.0"?> 
<project name="Higgins" default="jar" basedir="."> 

    <property name="jar.class.path" value="lib/forms-1.2.0.jar lib/BrowserLauncher.jar"/> 

    <path id="project.class.path"> 
     <pathelement location="build"/> 
     <fileset dir="lib"> 
     <include name="forms-1.2.0.jar"/> 
     <include name="BrowserLauncher.jar"/> 
     </fileset> 
    </path> 

    <target name="prepare"> 
     <mkdir dir="build"/> 
    </target> 

    <target name="compile" depends="prepare" description="Compile core sources"> 
     <javac srcdir="src" 
       includes="**" 
       destdir="build" 
       debug="true" 
       source="1.5"> 
      <classpath refid="project.class.path"/> 
     </javac> 
    </target> 

    <target name="jar" depends="compile" description="Generates executable jar file"> 
     <jar jarfile="higgins.jar"> 
      <manifest> 
       <attribute name="Main-Class" value="nl.helixsoft.higgins.Main"/> 
       <attribute name="Class-Path" value="${jar.class.path}"/> 
      </manifest> 
      <fileset dir="build" includes="**/*.class"/>    
      <fileset dir="src" includes="**/*.properties"/>   
     </jar> 
    </target> 

</project> 

Trả lời

41

Giả sử Ant 1.7 trở lên, bạn có thể sử dụng tác vụ manifestclasspath.

<path id="dep.runtime"> 
    <fileset dir="./lib"> 
     <include name="**/*.jar" /> 
    </fileset> 
</path> 
<property name="dep_cp" value="${toString:dep.runtime}" /> 

<target name="default"> 
    <manifestclasspath property="manifest_cp" jarfile="myjar.jar"> 
     <classpath refid="dep.runtime" /> 
    </manifestclasspath> 
    <echo message="Build Classpath: ${dep_cp}" /> 
    <echo message="Manifest Classpath: ${manifest_cp}" /> 
</target> 
+1

Công việc này, nhưng chỉ khi bạn không có đường dẫn tuyệt đối trong đường dẫn lớp của bạn. Ví dụ, nếu bạn đang sử dụng gói debian 'libhibernate3-java' mà cài đặt trong'/usr/share/java/hibernate3.jar' và bạn bao gồm trong classpath của bạn, tác vụ ant manifestclasspath sẽ ném một lỗi. Tuy nhiên, giải pháp của Qianjigui vẫn hoạt động. – joscarsson

2

Nếu bạn chỉ muốn một subpath chung chia sẻ giữa hai (hoặc nhiều hơn) con đường, đó là dễ dàng để làm:

<path id="lib.path> 
    <fileset dir="lib"> 
     <include name="forms-1.2.0.jar"/> 
     <include name="BrowserLauncher.jar"/> 
    </fileset> 
</path> 

<path id="project.class.path"> 
    <pathelement location="build"/> 
    <path refid="lib.path"/> 
</path> 

<property name="jar.class.path" refid="lib.path"/> 

EDIT Xin lỗi, tôi hiểu lầm câu hỏi. Hãy thử điều này:

<property name="jar.class.path" value="lib/forms-1.2.0.jar lib/BrowserLauncher.jar"/> 

<path id="project.class.path"> 
    <pathelement location="build"/> 
    <fileset dir="." includes="${jar.class.path}"/> 
</path> 
+0

Không, điều đó không đúng. Trong trường hợp này, giá trị của jar.class.path được phân cách bằng dấu hai chấm thay vì dấu cách, và cái gì tệ hơn, nó sẽ sử dụng đường dẫn đầy đủ làm cho nó vô ích đối với biểu hiện jar. – amarillion

+0

Câu trả lời đã chỉnh sửa để trả lời nhận xét. –

+0

Vâng, điều đó làm việc trong ví dụ tôi đã đưa ra. Nhưng tôi thực sự muốn xây dựng classpath jar từ một tập tin và không phải là cách khác xung quanh, vì vậy tôi có thể sử dụng ký tự đại diện. – amarillion

1

Bạn có thể sử dụng <pathconvert> để chuyển đổi một đường dẫn (có thể chứa một fileset) thành một chuỗi đơn giản. Bạn có thể sẽ cần phải <vang> chuỗi vào một tập tin, sử dụng một trong hai <thay> hoặc <replaceregexp> chặt các bit con đường dẫn, sau đó cuối cùng sử dụng <loadfile> để nạp chuỗi thao tác vào bất động sản chính thức.

Thực hiện còn lại dưới dạng tập thể dục cho người đọc.

+0

Tính năng này hoạt động. Tôi đã sử dụng giải pháp này trong các kịch bản kiến ​​của tôi tại một số điểm. Nhưng nó là lộn xộn. –

+0

Thực sự là lộn xộn. Tôi thực sự muốn xem một ví dụ làm việc về điều này mà cắt các bit đường dẫn hàng đầu theo cách đa nền tảng ... – amarillion

39
<path id="build.classpath"> 
    <fileset dir="${basedir}"> 
    <include name="lib/*.jar"/> 
    </fileset> 
</path> 

<pathconvert property="manifest.classpath" pathsep=" "> 
    <path refid="build.classpath"/> 
    <mapper> 
    <chainedmapper> 
     <flattenmapper/> 
     <globmapper from="*.jar" to="lib/*.jar"/> 
    </chainedmapper> 
    </mapper> 
</pathconvert> 

<target depends="compile" name="buildjar"> 
    <jar jarfile="${basedir}/${test.jar}"> 
    <fileset dir="${build}" /> 
    <manifest> 
     <attribute name="Main-Class" value="com.mycompany.TestMain"/> 
     <attribute name="Class-Path" value="${manifest.classpath}"/> 
    </manifest> 
</jar> 
</target> 

Để biết thêm thông tin kiểm tra this article.

+0

cảm ơn điều này đã rất hữu ích! –

+0

Tại sao câu trả lời này không được chấp nhận? Điều này là hoàn hảo và hoạt động ngay cả với nhiều trình chuyển đổi đường dẫn – ha9u63ar

Các vấn đề liên quan