Локальная зависимость Maven не разрешает подчиненные зависимости - PullRequest
1 голос
/ 30 марта 2012

У меня проблемы с разрешением зависимостей из стороннего пакета.Я немного новичок в Maven.В основном это выглядит так:

git clone git://github.com/unidata/thredds.git
cd thredds
mvn install

Все отлично работает и все установлено в ~/.m2.Теперь я написал свой собственный код, который использует только что установленный пакет:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
    http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>test</groupId>
    <artifactId>test</artifactId>
    <packaging>jar</packaging>
    <version>0.1</version>
    <name>Test Package</name>

    <dependencies>
        <dependency>
            <groupId>edu.ucar</groupId>
            <artifactId>netcdf</artifactId>
            <version>4.3.8-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

Хорошо, это также прекрасно работает, когда я запускаю mvn package.Артефакт netcdf найден.Теперь, когда я пытаюсь запустить свой код, я начинаю с длинного пути ClassNotFoundException, и мне приходится добавлять все зависимости netcdf в мой путь к классам.

Я делаю что-то не так или долженпакет thredds и все его зависимости автоматически выбираются?

edit: пакет thredds имеет много подмодулей, одним из которых является netcdf.Мой код зависит только от jar netcdf.

edit: установлена ​​версия снимка

$ ls -l ~/.m2/repository/edu/ucar/netcdf/4.3.8-SNAPSHOT/
total 4272
-rw-rw-r-- 1 nwatkins nwatkins     700 2012-03-29 23:23 maven-metadata-local.xml
-rw-rw-r-- 1 nwatkins nwatkins     182 2012-03-29 23:23 _maven.repositories
-rw-rw-r-- 1 nwatkins nwatkins 4357494 2012-03-29 23:23 netcdf-4.3.8-SNAPSHOT.jar
-rw-rw-r-- 1 nwatkins nwatkins    7840 2012-03-29 22:28 netcdf-4.3.8-SNAPSHOT.pom

edit: для запуска кода, которыйнаходится в одном файле Test.java

$ java -cp target/test-0.1.jar Test

edit: первое сообщение об ошибке

$ java -cp target / test-0.1.jar Test

Exception in thread "main" java.lang.NoClassDefFoundError: ucar/ma2/InvalidRangeException
Caused by: java.lang.ClassNotFoundException: ucar.ma2.InvalidRangeException
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)

edit: тогда я просто пытаюсь вручную добавить банку зависимостей в путь к классу

$ java -cp ../thredds/cdm/target/netcdf-4.3.8-SNAPSHOT.jar:target/test-0.1.jar Test

xception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
    at ucar.nc2.NetcdfFile.<clinit>(NetcdfFile.java:97)
    at Test.main(Test.java:37)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    ... 2 more

Пакет slf4j также находится в ~/.m2.Я перестал пытаться добавлять вещи в путь к классам после этого, поскольку это казалось неправильным подходом.at java.lang.ClassLoader.loadClass (ClassLoader.java:266)

Ответы [ 5 ]

0 голосов
/ 30 марта 2012

Вам не хватает зависимости для:

орг / SLF4J / LoggerFactory

, другими словами, вам нужно добавить зависимость в ваш проект:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.6.4</version>
</dependency>

Предполагается, что вы используете log4j?

И, кроме того, основываясь на отсутствующем классе: ucar.ma2.InvalidRangeException, похоже, вам нужна другая дополнительная зависимость, кроме (может быть, посмотрите документацию, если она существует).

   <dependency>
        <groupId>edu.ucar</groupId>
        <artifactId>netcdf</artifactId>
        <version>4.3.8-SNAPSHOT</version>
    </dependency>
0 голосов
/ 30 марта 2012

Два решения здесь (причина проблемы была объяснена в нескольких ответах):

1. Используйте плагин maven exec для запуска приложения:

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <classpathScope>runtime</classpathScope>
                <executable>java</executable>
                <commandlineArgs>-classpath %classpath Test</commandlineArgs>
            </configuration>
        </plugin>

2.Вы также можете упаковать свой jar-файл со всеми его зависимостями, используя плагин сборки maven. Для этого вам нужно добавить следующее в ваши плагины вашей сборки:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.3</version>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
    <executions>
        <execution>
        <id>build-package</id>
        <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Затем вы можете использовать выходной jar, созданный сборкой maven, в вашем classpath arg

0 голосов
/ 30 марта 2012

Созданный вами проект maven упаковывает только ваши классы в test-0.1.jar.

Если вы используете простую команду java для запуска вашего приложения, вы ДОЛЖНЫ предоставить все другие файлы jar, от которых зависит ваш проект, до переключателя -classpath (или -cp) (или через переменную среды CLASSPATH).

Существуют альтернативные конфигурации упаковки, которые могут скопировать все необходимые зависимости в одну банку, если вы этого хотите.

Вот пример, который здесь является дословной копией -> http://www.sonatype.com/books/mvnref-book/reference/assemblies-sect-basics.html. Я рекомендую вам прочитать всю эту главу (черт возьми всю книгу) для лучшего понимания.

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>org.sonatype.mavenbook.assemblies</groupId>
    <artifactId>executable-jar</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>Assemblies Executable Jar Example</name>
    <url>http://sonatype.com/book</url>
    <dependencies>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.4</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.2-beta-2</version>
                <executions>
                    <execution>
                        <id>create-executable-jar</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <descriptorRefs>
                                <descriptorRef>
                                    jar-with-dependencies
                                </descriptorRef>
                            </descriptorRefs>
                            <archive>
                                <manifest>
                                    <mainClass>org.sonatype.mavenbook.App</mainClass>
                                </manifest>
                            </archive>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
0 голосов
/ 30 марта 2012

Если вы хотите иметь все зависимости в classpath, при запуске jar вы можете использовать maven-exec-plugin, чтобы запустить программу из maven и автоматически добавить все зависимости в ваш classpath.

0 голосов
/ 30 марта 2012

Похоже, вы пытаетесь запустить свой проект из целевой папки, и он не видит транзитивных зависимостей. Вам нужно будет использовать плагин maven dependencies, чтобы скопировать эти зависимости вместе с вашим jar-файлом.

Смотрите также: http://maven.apache.org/plugins/maven-dependency-plugin/copy-dependencies-mojo.html

Затем вы можете определить зависимости от этих jar-файлов либо вручную, либо с помощью сгенерированного файла манифеста: http://maven.apache.org/shared/maven-archiver/index.html

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