NoSuchMethodError при использовании настроенного кода netty c с maven (цель компилятора до 1.8) - PullRequest
0 голосов
/ 27 апреля 2020

Я поддерживаю библиотеку httpServer, которая построена на Netty и использует настроенную netty-codec-http. Предполагается, что библиотека будет работать для java версии> = 8. Она отлично работает на java 12, но не на java 8. Может кто-нибудь помочь с ее работой на java8.

I понять, что проблема, скорее всего, связана с изменениями в интерфейсе ByteBuffer на java9. Однако я не мог заставить его работать. То, что я пробовал до сих пор

  1. Создайте библиотеку netty-codec-http и httpServer на java8 (для источника и цели компилятора установлено значение 1.8) и запустите на java8

  2. Создайте библиотеку netty-codec-http и httpServer на java12 (источник компилятора = 12 и цель = 1.8) и запустите на java8

  3. Установка версии выпуска на 8

Исключение при использовании библиотеки

java.lang.NoSuchMethodError: java.nio.ByteBuffer.clear()Ljava/nio/ByteBuffer;
    at io.netty.buffer.PooledByteBuf.internalNioBuffer(PooledByteBuf.java:158)
    at io.netty.buffer.PooledByteBuf._internalNioBuffer(PooledByteBuf.java:188)
    at io.netty.buffer.PooledByteBuf.internalNioBuffer(PooledByteBuf.java:201)
    at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:253)
    at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1133)
    at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Thread.java:745)

Настройки Maven

//version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/Cellar/maven/3.6.3_1/libexec
Java version: 13.0.2, vendor: N/A, runtime: /usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.15.4", arch: "x86_64", family: "mac"


//command
cd /../netty
mvn clean install -pl codec-http -am 

netty-код c -http 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">

  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>io.netty</groupId>
    <artifactId>netty-parent</artifactId>
    <version>4.1.49.Final</version>
  </parent>

  <artifactId>netty-codec-http</artifactId>
  <packaging>jar</packaging>
  <version>4.1.49.Final.custom.1.0.0-SNAPSHOT</version>

  <name>Netty/Codec/HTTP</name>

  <properties>
    <javaModuleName>io.netty.codec.http</javaModuleName>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>netty-common</artifactId>
      <version>${project.parent.version}</version>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>netty-buffer</artifactId>
      <version>${project.parent.version}</version>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>netty-transport</artifactId>
      <version>${project.parent.version}</version>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>netty-codec</artifactId>
      <version>${project.parent.version}</version>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>netty-handler</artifactId>
      <version>${project.parent.version}</version>
    </dependency>
    <dependency>
      <groupId>com.jcraft</groupId>
      <artifactId>jzlib</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-core</artifactId>
    </dependency>
  </dependencies>
</project>

Библиотека httpServer pom. xml

<project //...>
//...
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-codec-http</artifactId>
            <version>4.1.49.Final.custom.1.0.0-SNAPSHOT</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.49.Final</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-tcnative-boringssl-static</artifactId>
            <version>2.0.30.Final</version>
            <classifier>linux-x86_64</classifier>
        </dependency>
    </dependencies>
</project>

1 Ответ

1 голос
/ 27 апреля 2020

Это результат компиляции с java9 + и запуска с java8. Причина в том, что в java9 ByteBuffer переопределяет некоторые методы, например flip (), и возвращает ByteBuffer обратно, в то время как java8 возвращал Buffer. Перекомпилируйте ваш код с jdk8, и проблема должна быть решена.

...