2010-06-20 27 views
69

Tôi muốn đặt JDK tools.jar làm phụ thuộc biên dịch. Tôi tìm thấy một số ví dụ mà chỉ sử dụng systemPath tài sản như sau:JDK tools.jar là phụ thuộc maven

<dependency> 
    <groupId>com.sun</groupId> 
    <artifactId>tools</artifactId> 
    <scope>system</scope> 
    <systemPath>${java.home}/../lib/tools.jar</systemPath> 
</dependency> 

Vấn đề là con đường là không đúng cho Mac Os X (tuy nhiên nó là chính xác cho Windows và Linux). Đối với nó, đường dẫn chính xác là $ {java.home} /../ Lớp học/lớp học.jar.

Tôi đang tìm cách để xác định thuộc tính maven sao cho nếu hệ thống được phát hiện là Mac Os X, giá trị được đặt thành $ {java.home} /../ Lớp học/classes.jar, nếu không, nó được đặt là thành $ {java.home} /../ lib/tools.jar (giống như có thể thực hiện với ANT). Có ai đó có ý tưởng không?

Trả lời

43

Đó là cấu hình dành cho, trích xuất đường dẫn đến thuộc tính, thiết lập cấu hình cho cửa sổ, OSX, v.v. và xác định giá trị thuộc tính một cách thích hợp.

Dưới đây là các trang doc rằng thảo luận về cấu hình cho hệ điều hành: Maven Local Settings Model

Cần endup tìm kiếm một cái gì đó như thế này:

<profiles> 
    <profile> 
     <id>windows_profile</id> 
     <activation> 
     <os> 
      <family>Windows</family> 
     </os> 
     </activation> 
     <properties> 
     <toolsjar>${java.home}/../lib/tools.jar</toolsjar> 
     </properties> 
    </profile> 
    <profile> 
     <id>osx_profile</id> 
     <activation> 
     <os> 
      <family>mac</family> 
     </os> 
     </activation> 
     <properties> 
     <toolsjar>${java.home}/../Classes/classes.jar</toolsjar> 
     </properties> 
    </profile> 
    </profiles> 
+0

Tôi đang chạy OS X 10.7 (Lion) và điều này làm việc cho tôi, ngoại trừ những điều buồn cười là tôi đã có một hồ sơ cá nhân * nix cho các hộp linux ( unix). Với cả hai hồ sơ trong đó, nó đã bỏ qua tiểu sử của tôi cho mac. Vì vậy, tôi có thể thay đổi đường dẫn cho mục nhập * nix hoặc tôi đã phải nhận xét tiểu sử của tiểu sử đó để hồ sơ của tôi hiển thị mac

+3

Nếu bạn cần hỗ trợ cả Apple Java 6 ('Lớp/lớp học. jar') và Oracle Java 7 ('lib/tools.jar') trên OS X, điều này sẽ không hoạt động, nhưng câu trả lời của @ Laurent sẽ. –

+1

http://stackoverflow.com/a/29585979 Có vẻ là một câu trả lời tốt hơn cho JDK 1.7, JDK 1.8 và El Capitan cho tôi. –

36

Cảm ơn bạn đã giới thiệu cho tôi hồ sơ maven. chỉ phần tài sản có thể:

Tôi đã sử dụng hồ sơ như đã đề cập ở trên và bằng cách kích hoạt một hồ sơ cá nhân dựa trên sự hiện diện của các tập tin mong muốn:

<profiles> 
    <profile> 
     <id>default-profile</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
      <file> 
       <exists>${java.home}/../lib/tools.jar</exists> 
      </file> 
     </activation> 
     <properties> 
      <toolsjar>${java.home}/../lib/tools.jar</toolsjar> 
     </properties> 
    </profile> 
    <profile> 
     <id>mac-profile</id> 
     <activation> 
      <activeByDefault>false</activeByDefault> 
      <file> 
       <exists>${java.home}/../Classes/classes.jar</exists> 
      </file> 
     </activation> 
     <properties> 
      <toolsjar>${java.home}/../Classes/classes.jar</toolsjar> 
     </properties> 
    </profile> 
</profiles> 

tôi đăng câu trả lời này để làm nổi bật một sai lầm trong bài trước được sử dụng trong phần kích hoạt để kích hoạt một hồ sơ dựa trên sự tồn tại của thuộc tính được chỉ định. Để xác định thuộc tính, phần thuộc tính phải được sử dụng như trên.

+0

Điều tốt về kiểm tra sự tồn tại của classes.jar là nó quay trở lại sử dụng tools.jar trên nền tảng Mac. Điều này có thể quan trọng đối với OpenJDK trong tương lai được phát hành trên Mac ([link] (http://openjdk.java.net/projects/macosx-port/)) vì nó có thể sẽ có một tệp tools.jar chứ không phải classes.jar. – prunge

+0

+1 bởi vì điều này kiểm tra cho các tập tin thực tế chúng tôi đang sau và không dựa vào phát hiện hệ điều hành (đó là không cần thiết anyway) –

+0

Closer, nhưng http://stackoverflow.com/a/29585979 là một giải pháp tốt hơn cuối cùng (cho JDK 1,7/1,8 và El Capitan) ít nhất. –

-11

giải pháp của tôi:

  1. đặt tools.jar của Mặt Trời đến $JAVA_HOME/lib
  2. tạo ra một liên kết tượng trưng trong $JAVA_HOME/.. tên lib nơi mục tiêu sẽ $JAVA_HOME/lib
+8

Nó không phải là một giải pháp tốt vì nó ngụ ý để thực hiện một số hành động trên mỗi máy nơi tệp JAR phải được đặt trong đường dẫn lớp. – Laurent

+0

Tôi đã thử điều này và các biến thể của điều này dựa trên các giải pháp tôi tìm thấy ở nơi khác và không nhận được kết quả tôi mong đợi. –

9

Hi Tôi biết các bạn là tất cả thông minh, nhưng nó gây ra cho tôi vài ngày để tìm ra câu trả lời là không hoàn thành - cả hồ sơ và sự phụ thuộc là cần thiết. Tôi hy vọng sẽ không có ai lãng phí thời gian nữa. Vui lòng xem mã hoàn chỉnh của tôi bên dưới:

<profiles> 
    <profile> 
     <id>osx_profile</id> 
     <activation> 
      <activeByDefault>false</activeByDefault> 
      <os> 
       <family>mac</family> 
      </os> 
     </activation> 
     <properties> 
      <toolsjar>${java.home}/../Classes/classes.jar</toolsjar> 
     </properties> 
     <dependencies> 
      <dependency> 
       <groupId>com.sun</groupId> 
       <artifactId>tools</artifactId> 
       <version>1.6.0</version> 
       <scope>system</scope> 
       <systemPath>${toolsjar}</systemPath> 
      </dependency> 
     </dependencies> 
    </profile> 
</profiles> 
+2

Phần 'phụ thuộc' bên trong cấu hình là không cần thiết. Nó là đủ để có điều này tuyên bố, một lần, bên ngoài hồ sơ và sau đó có các cấu hình xác định giá trị chính xác cho các 'toolsjar' bất động sản. –

+1

Sự phụ thuộc này chỉ cần thiết cho mac, tốt hơn là chỉ khai báo bên trong cấu hình này – Jianyu

+0

Không nên là dòng ' $ {java.home} /../ Lớp học/classes.jar 'thay vì' $ {java.home } /../ lib/tools.jar '? – Jens

8

Bằng cách nào đó, nhật thực trong cửa sổ không nhận được {java.home}. Vì vậy, tôi đã phải thiết lập JAVA_HOME thay vì java.home. JAVA_HOME được đặt trong Run-> Run Configurations-> Environment. Điều này làm việc cho tôi với JDK tiêu chuẩn (không phải của Apple JDK).

<profiles> 
     <profile> 
      <id>windows-profile</id> 
      <activation> 
       <activeByDefault>true</activeByDefault> 
       <file> 
        <exists>${JAVA_HOME}/lib/tools.jar</exists> 
       </file> 
      </activation> 
      <properties> 
       <toolsjar>${JAVA_HOME}/lib/tools.jar</toolsjar> 
      </properties> 
     </profile> 
     <profile> 
      <id>mac-profile</id> 
      <activation> 
       <activeByDefault>false</activeByDefault> 
       <file> 
        <exists>${java.home}/../lib/tools.jar</exists> 
       </file> 
      </activation> 
      <properties> 
       <toolsjar>${java.home}/../lib/tools.jar</toolsjar> 
      </properties> 
     </profile> 
    </profiles> 


    <dependencies> 
     <dependency> 
       <groupId>jdk.tools</groupId> 
       <artifactId>jdk.tools</artifactId> 
       <version>jdk1.8.0</version> 
       <scope>system</scope> 
       <systemPath>${toolsjar}</systemPath> 
      </dependency> 
     </dependencies> 
+1

Đây là một câu hỏi cũ được hỏi ở nhiều nơi. Bởi vì đây là năm 2016 và tôi đang sử dụng El Capitan với JDK 1.7 và JDK 1.8 được cài đặt, tôi nghĩ đây là cách đơn giản và sạch nhất để giải quyết vấn đề này trong cả STS (Eclipse) và Maven (dòng lệnh) mà không cần phải tạo symlink hoặc bằng cách nào đó bác sĩ hệ thống được cài đặt. Nó làm việc lần đầu tiên cho tôi. :) :) :) –

1

Nhận xét của Edward là chính xác.

Bạn cần tiểu sử VÀ bạn cần dependency bên ngoài khối profiles. Cấu hình chỉ xác định giá trị ${toolsjar} sẽ nhận được.

<dependencies> 
    <dependency> 
     <groupId>jdk.tools</groupId> 
     <artifactId>jdk.tools</artifactId> 
     <version>jdk1.8.0</version> 
     <scope>system</scope> 
     <systemPath>${toolsjar}</systemPath> 
    </dependency> 
</dependencies>