зависимость не найдена во время выполнения maven - PullRequest
6 голосов
/ 08 июля 2011

Я новичок в Maven и несколько новичок в Java. Пробовал Google и связанные источники, но я не нашел тот, который напоминал бы мою ситуацию.

Сейчас у меня есть проект maven X и Y. X может рассматриваться как разделяемая библиотека с некоторыми утилитами, Y - это простая JFrame с напечатанным "hello world" и вызовом статического метода в X.

Я делаю «Выполнить как maven install» на проекте X, я получаю "build successful". Я добавляю проект X в качестве зависимости в проект Y (используя pom-редактор в Eclipse, просматривая хранилище и находя его). Я делаю "Выполнить как maven package" на проекте Y, я получаю "build successful". После запуска проекта Y через java -jar или проверки созданного фляги проект X отсутствует везде, и я получаю необычный класс, не найденный в качестве исключения. Eclipse находит его, и в редакторе исходного кода нет ошибок компиляции.

Почему он работает только в редакторе Eclipse, а не как jar?

РОМ:

    <dependency>
        <groupId>com.company.deployment.shared</groupId>
        <artifactId>com.company.deployment.shared</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>

Ответы [ 6 ]

7 голосов
/ 08 июля 2011

Maven не создает для вас комбинированный файл JAR. Что Eclipse делает, так это просматривает конфигурацию Maven и добавляет все необходимые классы / файлы jar для вашего classpath для вас при запуске.

Если вы хотите запустить вашу программу из командной строки, вам нужно будет вручную добавить все JAR-файлы в ваш путь к классам.

Кроме того, вы можете запустить вашу программу напрямую из Maven , которая должна установить все ваши зависимости. В зависимости от того, что вы хотите сделать, есть несколько вариантов, то есть, если это приложение, предназначенное для запуска конечным пользователем, вы можете заглянуть в плагин one-jar Maven .

1 голос
/ 08 июля 2011

Вы также можете найти exec-maven-plugin полезным

mvn exec:java -Dexec.mainClass="com.example.Main" [-Dexec.args="argument1"] ...
mvn exec:exec -Dexec.executable="maven" [-Dexec.workingdir="/tmp"] -Dexec.args="-X myproject:dist"

Если ваш клиент не может загружать зависимости из репозитория maven m2 на лету, как за брандмауэром, или без подключения к Интернету, то вам также необходимо упаковать зависимости, используя maven-dependency-plugin , чтобы скопировать все зависимости и maven-assembly-plugin для сборки зависимостей

1 голос
/ 08 июля 2011

Я рекомендую вам взглянуть на плагин Maven Shade . Это создаст «uber-jar», включающий ваш проект и все его зависимости. Он также может выполнять другие действия, такие как установка класса точки входа, чтобы сделать JAR-файл исполняемым JAR.

0 голосов
/ 21 ноября 2012

Фил Сакре уже хорошо объяснил основную проблему (в принципе, просто нет информации о том, где найти X.jar, встроенный в ваш Y.jar).

Кроме того, вы также можете посмотреть на appassembler-maven-plugin (который может, например, генерировать сценарии запуска для вашего Y-проекта, у которого уже установлен правильный путь к классу) и / или exec-maven-plugin (который вы можете использовать, например, для непосредственного запуска Y с правильным путем к классу, используя maven).

0 голосов
/ 10 июля 2011

Артефакт, созданный в проекте Y, содержит только результаты сборки только в проекте Y, не включая его зависимости.

Если вы хотите создать JAR в Y, который вы можете выполнить напрямую, вы можете использовать плагин сборки.

Например, самый простой способ построить uber-jar для проекта Y:

<project>
  ...
  <build>
    ...
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2.1</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        <executions>
          <execution>
            <id>make-all-in-one-jar</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
            ...
</project>

Помимо обычного артефакта, будет создана сборка, содержащая классы и т. Д. Из зависимостей, которые можно выполнить с помощью java -jar

Посетите http://maven.apache.org/plugins/maven-assembly-plugin/ для более сложного использования.

0 голосов
/ 08 июля 2011

Это не работает, потому что Maven разрешает зависимости при создании вашего проекта, но не помещает все зависимости волшебным образом в ваш jar. Вы должны запустить свое приложение со всеми его зависимостями в classpath:

java -classpath X.jar;Y.jar com.foo.bar.Main

Или вам нужно настроить плагин maven jar, чтобы создать исполняемый jar, как описано здесь . И вы также можете использовать плагин maven сборка для копирования всех зависимостей вашего проекта Y в целевой каталог, рядом с сгенерированным Y.jar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...