Строить исполняемую банку с мавеном?

== сравнивает ссылки на объекты в Java и не является исключением для объектов String.

Для сравнения фактического содержимого объектов (в том числе String) необходимо использовать equals.

Если сравнение двух объектов String с использованием == оказывается true, это связано с тем, что объекты String были интернированы, а виртуальная машина Java имеет несколько ссылки указывают на тот же экземпляр String. Не следует ожидать сравнения одного объекта String, содержащего то же содержимое, что и другой объект String, используя == для оценки как true.

118
задан Joshua Taylor 13 September 2017 в 11:43
поделиться

1 ответ

На самом деле, я думаю, что ответ, данный в вопросе , который вы упомянули, просто неверен ( ОБНОВЛЕНИЕ - 20101106: кто-то исправил это, этот ответ относится к версии, предшествующей редактированию ), и это объясняет, по крайней мере частично, почему у вас проблемы.


Он генерирует два файла jar в logmanager / target: logmanager-0.1.0.jar и logmanager-0.1.0-jar-with-dependencies.jar.

Первый - это JAR-файл модуля logmanager, созданный во время фазы пакета jar: jar (поскольку модуль имеет упаковку типа jar ). Вторая - это сборка, созданная сборкой : сборка и должна содержать классы из текущего модуля и его зависимости (если вы использовали дескриптор jar-with-dependencies ).

Я получаю сообщение об ошибке, когда дважды щелкаю первый jar:

 Не удалось найти основной класс: com.gorkwobble.logmanager.LogManager. Программа будет закрыта.

Если вы применили предложенную конфигурацию ссылки, размещенной в качестве справки, вы настроили плагин jar для создания исполняемого артефакта, примерно так:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>

Итак, logmanager-0.1.0.jar действительно исполняемый файл, но 1. это не то, что вы хотите (потому что он не имеет всех зависимостей) и 2. он не содержит com.gorkwobble.logmanager.LogManager (это то, что говорит ошибка, проверьте содержимое jar).

Немного другая ошибка, когда я дважды щелкаю jar-with-dependencies.jar:

 Не удалось загрузить атрибут манифеста основного класса из: C: \ EclipseProjects \ logmanager \ target \ logmanager-0.1.0-jar-with-dependencies.jar

Опять же, если вы настроили подключаемый модуль сборки, как было предложено, у вас будет что-то вроде этого:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin>

При этой настройке logmanager-0.1.0-jar-with-dependencies.jar содержит классы из текущий модуль и его зависимости, но, согласно ошибке, его META-INF / MANIFEST.MF не не содержит Main-Class запись (вероятно, это не тот же файл MANIFEST.MF, что и в logmanager-0.1.0.jar). На самом деле jar является не исполняемым файлом, что опять же не то, что вам нужно.


Итак, я предлагаю удалить элемент конфигурации из maven-jar-plugin и настройте maven-assembly-plugin следующим образом:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.2</version>
    <!-- nothing here -->
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-4</version>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>org.sample.App</mainClass>
        </manifest>
      </archive>
    </configuration>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Конечно, замените org.sample.App классом, который вы хотите выполнить. Маленький бонус, я связанная сборка : отдельная к фазе пакета , поэтому вам больше не нужно запускать сборку: сборку . Просто запустите mvn install , и сборка будет создана во время стандартной сборки.

Итак, обновите ваш pom.xml конфигурацией, указанной выше, и запустите mvn clean install . Затем перейдите в каталог target и повторите попытку:

java -jar logmanager-0.1.0-jar-with-dependencies.jar

Если вы получили сообщение об ошибке, обновите свой вопрос, добавив его в свой вопрос и опубликуйте содержание META-INF / MANIFEST.MF и соответствующую часть вашего pom.xml (части конфигурации плагинов). Также опубликуйте результат:

java -cp logmanager-0.1.0-jar-with-dependencies.jar com.gorkwobble.logmanager.LogManager

, чтобы продемонстрировать, что он работает нормально в командной строке (независимо от того, что говорит eclipse).

EDIT: для Java 6, вам необходимо настроить maven-compiler-plugin. Добавьте это в свой pom.xml:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.6</source>
      <target>1.6</target>
    </configuration>
  </plugin>
243
ответ дан 24 November 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: