JDK tools.jar як залежність maven


77

Я хотів би поставити JDK tools.jar як залежність компіляції. Я знайшов кілька прикладів, які вказують на використання властивості systemPath, наприклад:

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

Проблема полягає в тому, що шлях неправильний для Mac Os X (проте він правильний для Windows та Linux). Для нього правильним шляхом є $ {java.home} /../ Classes / classes.jar .

Я шукаю спосіб для того, щоб визначити властивість maven таким чином, що якщо система виявляється як Mac Os X, значенням є $ {java.home} /../ Classes / classes.jar , інакше воно має значення $ {java.home} /../ lib / tools.jar (як це можливо зробити з ANT). Хтось має ідею?



@ user7610 Це не дублікат, це питання стосується ситуації до Java 9. Дублікат, який ви пропонуєте, обробляє ситуацію після Java 9.
Марк Роттевель,

Відповіді:


47

Для цього призначені профілі, витягніть шлях до властивості, налаштуйте профілі для Windows, OSX тощо та визначте значення властивостей належним чином.

Ось сторінка документа, на якій обговорюються профілі для ОС: Модель локальних налаштувань Maven

Це повинно закінчитися виглядати приблизно так:

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

Я працюю на OS X 10.7 (Lion), і це спрацювало для мене, за винятком того, що найцікавіше було те, що я вже мав профіль * nix для Linux-боксів (<family> unix </family>). З обома цими профілями там, це ігнорувало мій профіль для <family> mac </family>. Тож я міг або змінити шлях для запису профілю * nix, або мені довелося закоментувати профіль для цього профілю, щоб він бачив мій профіль для <family> mac </family>
Mark J Miller,

3
Якщо вам потрібно підтримувати як Apple Java 6 ( Classes/classes.jar), так і Oracle Java 7 ( lib/tools.jar) в OS X, це не спрацює, але відповідь @ Laurent буде.
Matt McHenry

1
stackoverflow.com/a/29585979 Здається, для мене це краща відповідь для JDK 1.7, JDK 1.8 та El Capitan.
Пол Каннінгем,

яким повинен бути шлях і ім'я цього файлу?
vivekanon

40

Дякуємо, що представили мені профілі maven.

Я використовував профіль, як згадано вище, і активуючи профіль на основі наявності потрібного файлу:

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

Я опублікував цю відповідь, щоб підкреслити помилку в попередньому дописі: розділ властивостей можна використовувати лише в розділі активації, щоб активувати профіль на основі існування зазначеної властивості. Для того, щоб визначити властивість, слід використовувати розділ властивостей, як вище.


Хороша річ у перевірці існування classes.jar полягає в тому, що він повертається до використання tools.jar на платформі Mac. Це може бути важливим для майбутнього OpenJDK, випущеного на Mac ( посилання ), оскільки він, швидше за все, матиме tools.jar, а не classes.jar.
стрижка

+1, оскільки це тестує фактичний файл, який ми шукаємо, і не покладається на виявлення ОС (що в будь-якому випадку не потрібно)
Stefan Haberl,

Ближче, але stackoverflow.com/a/29585979, зрештою, було кращим рішенням (принаймні для JDK 1.7 / 1.8 та El Capitan).
Paul Cunningham

9

Привіт, я знаю, що ви всі розумні, але через кілька днів я зрозумів, що відповідь не є повною - необхідні як профіль, так і залежність. Сподіваюся, ніхто більше на це не витратить час. Будь ласка, перегляньте мій повний код нижче:

<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
dependenciesРозділ всередині профілю не потрібно. Досить одного разу це оголосити поза профілем, а потім зробити так, щоб профілі визначили правильне значення для toolsjarвластивості.
Едвард Самсон,

1
Ця залежність потрібна лише для mac, краще лише оголосити всередині цього профілю
Jianyu

Чи не повинна лінія <toolsjar>${java.home}/../Classes/classes.jar</toolsjar>скоріше бути <toolsjar>${java.home}/../lib/tools.jar</toolsjar>?
Йенс

7

Якось затемнення у вікнах не вдається вловити {java.home}. Отже, мені довелося встановити JAVA_HOME замість java.home. JAVA_HOME було встановлено в Run-> Run Configurations-> Environment. Це працювало у мене зі стандартним JDK (не з 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
Це старе запитання, яке задають у багатьох місцях. Оскільки це 2016 рік, і я використовую El Capitan із встановленими JDK 1.7 та JDK 1.8, я вважаю, що це найпростіший та найчистіший спосіб вирішити цю проблему як у STS (Eclipse), так і в Maven (командний рядок) без необхідності створювати символьні посилання або якось доктор встановленої системи. У мене це вийшло вперше. :) :) :)
Пол Каннінгем

5

Я знайшов рішення в Q: Оголосіть залежність maven від tools.jar для роботи на JDK 9

Оскільки справжнє майстерство Maven досить складне, що дивує новачкам і є предметом майбутніх удосконалень, краще не копіювати його. Отже, цей модуль існує, тому вам не доведеться знати або дбати про деталі. ~~ https://github.com/olivergondza/maven-jdk-tools-wrapper

<dependency>
  <groupId>com.github.olivergondza</groupId>
  <artifactId>maven-jdk-tools-wrapper</artifactId>
  <version>0.1</version>
</dependency>

1

Коментар Едварда правильний.

Вам потрібен профіль І вам потрібна dependencyзовнішня частина profilesблоку. Профіль просто визначає, яке значення ${toolsjar}отримає.

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

0

Правильна інструкція для початківців

Спочатку додайте цей профіль до файлу Pom.xml над тегом або де-небудь ще в ньому.

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

потім Правильний шлях JRE

Йти до :

Windows> Preferecnes> Встановлені JRE

вибраний вбудований JRE і двічі клацніть на ньому або в правому меню натисніть редагувати, а потім переконайтеся, що JRE Домашній шлях знаходиться всередині JDK приблизно так:

C: \ Program Files \ Java \ jdk1.8.0_181 \ jre

якщо ви встановили JRE окремо, тоді eclipse вибрав би самостійний JRE, наприклад:

C: \ Program Files \ Java \ jre1.8.0_181 \

тому змініть його на JRE, який поставляється з JDK:

C: \ Program Files \ Java \ jdk1.8.0_181 \ jre


-11

моє рішення:

  1. покласти інструменти Сонця.jar до $JAVA_HOME/lib
  2. зробіть символічне посилання в $JAVA_HOME/..названій бібліотеці, де буде ціль$JAVA_HOME/lib

8
Це не є гарним рішенням, оскільки воно передбачає виконання деяких дій на кожній машині, де файл JAR повинен бути розміщений у шляху до класу.
Лоран,

Я спробував це та його варіанти на основі рішень, які я знайшов в іншому місці, і не отримав очікуваних результатів.
Пол Каннінгем,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.