2015-11-12 4 views
0

Я пытаюсь интегрировать вызов джерси в стиле приветствия в существующее приложение, используя grizzly2.Класс несовместимости при попытке запуска трикотажа внутри гризли?

Я добавил эту зависимость к моему Maven ПОМ:

<dependency> 
    <groupId>org.glassfish.jersey.containers</groupId> 
    <artifactId>jersey-container-grizzly2-http</artifactId> 
    <version>2.22.1</version> 
</dependency> 

, который производит это дерево зависимостей:

[INFO] +- org.glassfish.jersey.containers:jersey-container-grizzly2-http:jar:2.22.1:compile 
[INFO] | +- org.glassfish.hk2.external:javax.inject:jar:2.4.0-b31:compile 
[INFO] | +- org.glassfish.grizzly:grizzly-http-server:jar:2.3.23:compile 
[INFO] | | \- org.glassfish.grizzly:grizzly-http:jar:2.3.23:compile 
[INFO] | |  \- org.glassfish.grizzly:grizzly-framework:jar:2.3.23:compile 
[INFO] | +- org.glassfish.jersey.core:jersey-common:jar:2.22.1:compile 
[INFO] | | +- javax.annotation:javax.annotation-api:jar:1.2:compile 
[INFO] | | +- org.glassfish.jersey.bundles.repackaged:jersey-guava:jar:2.22.1:compile 
[INFO] | | +- org.glassfish.hk2:hk2-api:jar:2.4.0-b31:compile 
[INFO] | | | +- org.glassfish.hk2:hk2-utils:jar:2.4.0-b31:compile 
[INFO] | | | \- org.glassfish.hk2.external:aopalliance-repackaged:jar:2.4.0-b31:compile 
[INFO] | | +- org.glassfish.hk2:hk2-locator:jar:2.4.0-b31:compile 
[INFO] | | | \- org.javassist:javassist:jar:3.18.1-GA:compile 
[INFO] | | \- org.glassfish.hk2:osgi-resource-locator:jar:1.0.1:compile 
[INFO] | +- org.glassfish.jersey.core:jersey-server:jar:2.22.1:compile 
[INFO] | | +- org.glassfish.jersey.core:jersey-client:jar:2.22.1:compile 
[INFO] | | +- org.glassfish.jersey.media:jersey-media-jaxb:jar:2.22.1:compile 
[INFO] | | \- javax.validation:validation-api:jar:1.1.0.Final:compile 
[INFO] | \- javax.ws.rs:javax.ws.rs-api:jar:2.0.1:compile 
[INFO] \- junit:junit:jar:4.12:test 
[INFO] \- org.hamcrest:hamcrest-core:jar:1.3:test 

Я пытаюсь воспитать гризли следующим образом:

private static final URI BASE_URI = URI.create("http://localhost:8080/base/"); 
    public static final String ROOT_PATH = "helloworld"; 

    public static void main(String[] args) throws IOException, InterruptedException 
    { 
      System.out.println("\"Hello World\" Jersey Example App"); 

      final ResourceConfig resourceConfig = new ResourceConfig(RestTest.class); 
      final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(BASE_URI, resourceConfig, false); 

Но это приводит к ошибке, которая указывает неверно подобранный набор файлов jar:

Exception in thread "main" java.lang.NoSuchMethodError: org.glassfish.jersey.internal.util.PropertiesHelper.getValue(Ljava/util/Map;Ljavax/ws/rs/RuntimeType;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object; 
    at org.glassfish.jersey.moxy.json.MoxyJsonFeature.configure(MoxyJsonFeature.java:60) 
    at org.glassfish.jersey.model.internal.CommonConfig.configureFeatures(CommonConfig.java:714) 
    at org.glassfish.jersey.model.internal.CommonConfig.configureMetaProviders(CommonConfig.java:644) 
    at org.glassfish.jersey.server.ResourceConfig.configureMetaProviders(ResourceConfig.java:829) 
    at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:453) 
    at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:184) 
    at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:350) 
    at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:347) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:255) 
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:347) 
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:311) 
    at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer.<init>(GrizzlyHttpContainer.java:337) 
    at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory.createHttpServer(GrizzlyHttpServerFactory.java:140) 
    at gov.vha.isaac.demo.RestMain.main(RestMain.java:20) 

Я пытался заставить нарушителя баночку (Джерси-общий) для различных различных версий, но все они не так же, как (или хуже, если я вернусь к далеко)

Я пробовал разные версии grizzly - но единственная версия, которую я могу начать, - настолько старая, что теперь я сталкиваюсь с проблемами с несоответствием версии HK2 между гризли и другим кодом.

Как можно смириться с миром гризли?

Или может кто-то указать мне на глупую вещь, которую я делаю неправильно?

+0

Только одна зависимость не приведет к этой ошибке. Есть другие зависимости, которые вы нам не показываете. В общем, сохраняйте все версии зависимости от Джерси одинаковыми. Эта проблема, скорее всего, вызвана различными зависимостями версии Джерси. –

+0

Если вы хотите создать проект из архетипа Maven, см. [Здесь] (https://jersey.java.net/documentation/latest/getting-started.html#new-from-archetype). Это даст вам бесплатное приложение. –

+0

Я буду обновлять завтра, но, выбив другую зависимость из моего проекта, я, наконец, дошел до точки, где он будет работать. Есть и другая библиотека, которую я включил, что было каким-то образом - привело к этому исключению - хотя я еще не знаю, как ... поскольку у меня нет других зависимостей от класса, у которого была неправильная версия. Переход к завершению прохождения дерева зависимостей и запрещение до тех пор, пока я не выясню, какая конкретная библиотека вызывает несовместимость. – user2163960

ответ

0

Оказывается, это цепь зависимость, которая ведет к классовой несовместимости:

[INFO] | \- au.csiro:snorocket-core:jar:2.7.5:compile 
[INFO] |  \- au.csiro:ontology-model:jar:2.8.2:compile 
[INFO] |  \- org.glassfish.jersey.media:jersey-media-moxy:jar:2.2:compile 
[INFO] |   +- org.eclipse.persistence:org.eclipse.persistence.moxy:jar:2.5.0:compile 
[INFO] |   | \- org.eclipse.persistence:org.eclipse.persistence.core:jar:2.5.0:compile 
[INFO] |   |  \- org.eclipse.persistence:org.eclipse.persistence.asm:jar:2.5.0:compile 
[INFO] |   \- org.eclipse.persistence:org.eclipse.persistence.antlr:jar:2.5.0:compile 

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

Поскольку библиотека org.glassfish.jersey.core: jersey-common является ТАКЖЕ зависимой позже в проекте, она не печатала ее здесь.

В действительности, org.glassfish.jersey.media:jersey-media-moxy:jar:2.2 зависит от org.glassfish.jersey.core: джерси-общее: баночка: 2,2

Мой гризли зависимость была вытягивание в org.glassfish.jersey.core: jersey-common: jar: 2.22.1

Эти две версии несовместимы.

Теперь, если бы я просто упаковывал проект с Maven, он (возможно) работал нормально - как я думаю, maven выравнивается по версии 2.22.1. Тем не менее, я пытался проверить в затмении. И плагин m2e для Eclipse делает NOT, кажется, правильно настроил путь к классу - скорее - он заканчивается, в том числе BOTH версии jar на пути к классу в то же время.

Пока что я не могу найти все это, чтобы запустить его в затмении, потому что m2e настаивает на включении обоих jars в путь к классам - даже когда я добавляю исключение, чтобы попытаться сохранить старую версию jar.

--edit--

я, наконец, получить его запустить, перейдя в проект в затмении, который в зависимости snorocket-ядро, и делает исключение из джерси-медиа-Moxy, а затем, потянув в более новая версия джерси-медиа-мокси.

Это позволило мне, наконец, получить m2e для создания надлежащего пути к классам в затмении. Похоже, что m2e неправильно настроил путь к классу, когда он включает в себя другие локальные проекты в пути к классам - он просто слепо тянет во всех зависимостях проекта - без учета того, имеет ли этот проект другую версию баночки, чем другой проект - он не выбирает одну версию банки для использования так же, как это делает maven.