2017-08-10 16 views
0

私は、クエリのハイブ結果を取得してXML形式で表示するために、Dropwizardを使用してWS RESTを作成しようとしています。これの分離された部分は、エラーなく完了することができます。Dropwizardとhive-jdbcの互換性がありません

私がすべてに参加したとき、私はDropwizardとhive-jdbcの間に互換性がなくなりました。明らかにhive-jdbcにはジャージー1があり、Dropwizardにはジャージー2があります。

これが問題なのかどうかは分かりません。私はpom.xmlの依存関係を除外しようとしましたが、解決しませんでした。

コードの任意の部分を使用したりインポートしたりせずに、hive-jdbcをpom.xmlファイルの依存関係として置くだけのアプリケーションを作成しようとしましたが、まだエラーが発生しています。

のpom.xml

<?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/maven-v4_0_0.xsd"> 

    <prerequisites> 
     <maven>3.0.0</maven> 
    </prerequisites> 

    <modelVersion>4.0.0</modelVersion> 
    <groupId>test</groupId> 
    <artifactId>ws-test</artifactId> 
    <version>1.0.0</version> 
    <name>ws-test</name> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <dropwizard.version>1.0.5</dropwizard.version> 
     <mainClass>test.TestApp</mainClass> 
    </properties> 

    <dependencyManagement> 
     <dependencies> 
      <dependency> 
       <groupId>io.dropwizard</groupId> 
       <artifactId>dropwizard-bom</artifactId> 
       <version>${dropwizard.version}</version> 
       <type>pom</type> 
       <scope>import</scope> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 

    <dependencies> 
     <dependency> 
      <groupId>io.dropwizard</groupId> 
      <artifactId>dropwizard-core</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>io.dropwizard</groupId> 
      <artifactId>dropwizard-forms</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.hive</groupId> 
      <artifactId>hive-jdbc</artifactId> 
      <version>1.1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.hadoop</groupId> 
      <artifactId>hadoop-core</artifactId> 
      <version>1.2.1</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <artifactId>maven-shade-plugin</artifactId> 
       <version>2.4.1</version> 
       <configuration> 
        <createDependencyReducedPom>true</createDependencyReducedPom> 
        <transformers> 
         <transformer 
          implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> 
         <transformer 
          implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
          <mainClass>${mainClass}</mainClass> 
         </transformer> 
        </transformers> 
        <!-- exclude signed Manifests --> 
        <filters> 
         <filter> 
          <artifact>*:*</artifact> 
          <excludes> 
           <exclude>META-INF/*.SF</exclude> 
           <exclude>META-INF/*.DSA</exclude> 
           <exclude>META-INF/*.RSA</exclude> 
          </excludes> 
         </filter> 
        </filters> 
       </configuration> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>shade</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <artifactId>maven-jar-plugin</artifactId> 
       <version>2.6</version> 
       <configuration> 
        <archive> 
         <manifest> 
          <addClasspath>true</addClasspath> 
          <mainClass>${mainClass}</mainClass> 
          <addDefaultImplementationEntries>true</addDefaultImplementationEntries> 
         </manifest> 
        </archive> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

TestApp.java

package test; 

import io.dropwizard.Application; 
import io.dropwizard.forms.MultiPartBundle; 
import io.dropwizard.setup.Bootstrap; 
import io.dropwizard.setup.Environment; 

public class TestApp extends Application<TestConf> { 

    public static void main(String[] args){ 
     try { 
      new TestApp().run(args); 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public String getName() { 
     return "ID Generator Server"; 
    } 

    @Override 
    public void initialize(final Bootstrap<TestConf> bootstrap) { 
     bootstrap.addBundle(new MultiPartBundle()); 
    } 

    @Override 
    public void run(final TestConf configuration, 
        final Environment environment) { 
     final TestRes resource = new TestRes(
       configuration.getTemplate(), 
       configuration.getDefaultName() 
      ); 
      environment.jersey().register(resource); 
    } 

} 

TestConf.java

package test; 

import io.dropwizard.Configuration; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import org.hibernate.validator.constraints.*; 

public class TestConf extends Configuration { 

    @NotEmpty 
    private String template; 

    @NotEmpty 
    private String defaultName = "MarineTraffic"; 

    @JsonProperty 
    public String getTemplate() { 
     return template; 
    } 

    @JsonProperty 
    public void setTemplate(String template) { 
     this.template = template; 
    } 

    @JsonProperty 
    public String getDefaultName() { 
     return defaultName; 
    } 

    @JsonProperty 
    public void setDefaultName(String name) { 
     this.defaultName = name; 
    } 
} 

私はいくつかのユーザーは(dropwizard and hive/hiverunner integration with mavenhttp://thread.gmane.org/gmane.comp.java.dropwizard.devel/461など)

を、同様のエラーを得ていることはジャージーで、この(非互換性であることがわかっ

WARN [2017-08-10 21:50:21,444] org.glassfish.jersey.internal.Errors: The following warnings have been detected: WARNING: Unknown HK2 failure detected: 
MultiException stack 1 of 2 
java.lang.NullPointerException 
    at com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.setConfiguration(AbstractJAXBProvider.java:107) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
... 
    at test.TestApp.main(TestApp.java:12) 
MultiException stack 2 of 2 
java.lang.IllegalStateException: Unable to perform operation: method inject on com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$App 
    at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:392) 
    at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471) 
... 

WARNING: Unknown HK2 failure detected: 
MultiException stack 1 of 3 
java.lang.NullPointerException 
    at com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.setConfiguration(AbstractJAXBProvider.java:107) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
... 
    at test.TestApp.main(TestApp.java:12) 
MultiException stack 2 of 3 
java.lang.IllegalStateException: Unable to perform operation: method inject on com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$App 
    at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:392) 
    at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471) 
... 
    at test.TestApp.main(TestApp.java:12) 
MultiException stack 3 of 3 
java.lang.IllegalStateException: Unable to perform operation: create on org.glassfish.jersey.message.internal.MessageBodyFactory 
    at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:386) 
    at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471) 
... 

:TestRes.java

package test; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

@Path("/hive") 
public class TestRes { 

    protected final static Logger LOGGER = LoggerFactory.getLogger(TestRes.class); 
    protected final static String HEADER = "GroupService::"; 

    public TestRes(String template, String defaultName) { 
     LOGGER.info(HEADER + "init: PostConstruct"); 
    } 

    @GET 
    @Path("/test") 
    @Produces(MediaType.TEXT_PLAIN) 
    public String getNewID() { 

     return "works"; 
    } 
} 

私が得たエラーは次のようでした)エラーを引き起こしている問題?誰もそれを解決する方法を知っていますか?

+0

maven shade pluginを見てください。 –

+0

maven-shade-pluginの設定で除外句を追加しようとしましたが、mavenが非互換性を訴えているjersey-serverを削除しました。しかし、何も変わりません。 – Caio

+0

Shadeでは、パッケージ名やパッケージへの参照を書き直すことができます。つまり、jersey1などのパッケージやhive-jdbcのパッケージへの参照を書き換えて問題を解決することができます。参照:https://stackoverflow.com/questions/13620281/what-is-the-maven-shade-plugin-used-for-and-why-would-you-want-to-relocate-java。 Shadeは、互換性のないライブラリに依存しなければならないという問題を解決できるように設計されています。それがあなたの問題なら、これはそれを修正するかもしれません。しかし、これは反射のように見えます。これはymmvを意味します。 –

答えて

1

このジャーナルの競合の問題は、hive-jdbcとhadoop-coreの両方からjersey 1の依存関係(com.sun.jersey)を除外します。あなたのテストアプリケーションを走らせていたが、それは以下の除外で働いた。

<dependency> 
     <groupId>org.apache.hive</groupId> 
     <artifactId>hive-jdbc</artifactId> 
     <version>1.1.0</version> 
     <exclusions> 
      <exclusion> 
       <groupId>com.sun.jersey</groupId> 
       <artifactId>*</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.hadoop</groupId> 
     <artifactId>hadoop-core</artifactId> 
     <version>1.2.1</version> 
     <exclusions> 
      <exclusion> 
       <groupId>com.sun.jersey</groupId> 
       <artifactId>*</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
+0

Lol。どうもありがとう。私はハープコアもジャージーを使用していることに気づいていませんでした。それは私が欠けていたもの。今、完璧に働いています。 hiveドライバとhadoopコアがジャージサーバーを使用する必要がある理由はまだ分かりません。 – Caio

関連する問題