当前位置: 首页 > 知识库问答 >
问题:

为什么我的maven构建在执行时找不到Netty的EventLoopGroup类?

韦修文
2023-03-14

我写我的代码后Netty的留档,然后我执行:

mvn package

它构建成功。然后我跑:

java -jar target/netty-listener-0.0.1-SNAPSHOT.jar

它向我提示了一个错误:

异常线程"main"java.lang.NoClassDefFoundError: io/netty/Channel/EventLoopGroup在java.lang.Class.getDeclaredmethod ods0(本地方法)在java.lang.Class.privateGetDeclaredmethod(Class.java:2701)在java.lang.Class.privateGetMEDRecursive(Class.java:3048)java.lang.Class.getMEDOD0(Class.java:3018)java.lang.Class.get方法(Class.java:1784)sun.launcher.发射台elper.validate主类(发射台elper.java:544)在sun.launcher.发射台elper.check和加载主(发射台Helper. java: 526)引起: java. lang。异常:io. netty. channel.在java. net的EventLoopGroup。在java. lang的URLClassLoader. findClass(URLClassLoader. java: 381)。ClassLoader. loadClass(ClassLoader. java: 424)at sun. misc.在java. lang启动$AppClassLoader. loadClass(Launcher. java: 331)。ClassLoader. loadClass(ClassLoader. java: 357)...7 more

据我所知,JRE并没有在执行时找到Netty的EventLoopGroup类。在Eclipse中,我在Maven的dependency选项卡上看到了netty all依赖项,EventLoopGroup就在那里。我尝试过多次更改Netty的版本,但都不起作用。

这是我的主要代码:

package paplistener;

import io.netty.bootstrap.ServerBootstrap;

import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class PAPServer 
{
    
    private int port;
    
    public PAPServer(int port)
    {
        this.port = port;
    }

    public void run() throws Exception
    {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
                .channel(NioServerSocketChannel.class)
                .childHandler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    public void initChannel(SocketChannel ch) throws Exception {
                        ch.pipeline().addLast(new CommandDecoder(),
                                            new PAPServerHandler());
                    }
                })
                .option(ChannelOption.SO_BACKLOG, 128)
                .childOption(ChannelOption.SO_KEEPALIVE, true);
            
            ChannelFuture f = b.bind(port).sync();
            
            f.channel().closeFuture().sync();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }

    public static void main(String[] args) throws Exception
    {
        int port = 8080;
        
        if(args.length > 0)
        {
            port = Integer.parseInt(args[0]);
        }
        
        new PAPServer(port).run();
    }
    
}

它几乎与Netty文档中的代码完全相同,但它在管道的开头添加了一个解码器。

这是我的pom。xml:

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>neurony.listener</groupId>
  <artifactId>netty-listener</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <dependencies>
    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.1.53.Final</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.12.1.GA</version>
    </dependency>
  </dependencies>
  <build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>paplistener.PAPServer</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.5.1</version>
                <executions>
                    <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>
                          ${project.build.directory}/dependency-jars/
                        </outputDirectory>
                    </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>
</build>
</project> 

我能做些什么来解决这个问题?

EDIT1:将maven shade插件添加到pom。但是(相同的)问题仍然存在。

添加到pom的线条:

        <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.4</version>
        <executions>
            <execution>
            <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <transformers>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <manifestEntries>
                                <Main-Class>paplistener.PAPServer</Main-Class>
                                <Build-Number>1</Build-Number>
                            </manifestEntries>
                        </transformer>
                    </transformers>
                </configuration>
            </execution>
        </executions>
        </plugin>

EDIT2:将artifactSet添加到pom。xml,但它不起作用

<artifactSet>
    <includes>
            <include>io.netty:*</include>
    </includes>
</artifactSet>

我也试过*:*就像尤里G.建议的那样。

EDIT3:解压的内容-l:

存档:netty-listener-0.0.1-SNAPSHOT。jar长度日期时间名称

    0  10-29-2020 10:17   META-INF/
  266  10-29-2020 10:17   META-INF/MANIFEST.MF
    0  10-29-2020 10:17   paplistener/
 2903  10-29-2020 10:17   paplistener/PAPCommandHandler.class
 2554  10-29-2020 10:17   paplistener/PAPServer.class
 2103  10-29-2020 10:17   paplistener/CommandDecoder.class
 2834  10-29-2020 10:17   paplistener/PAPServerHandler.class
 1319  10-29-2020 10:17   paplistener/PAPServer$1.class
    0  10-29-2020 10:17   META-INF/maven/
    0  10-29-2020 10:17   META-INF/maven/neurony.listener/
    0  10-29-2020 10:17   META-INF/maven/neurony.listener/netty-listener/
 3572  10-28-2020 12:29   META-INF/maven/neurony.listener/netty-listener/pom.xml
  125  10-29-2020 10:17   META-INF/maven/neurony.listener/netty-listener/pom.properties
15676                     13 files

似乎netty没有被复制到jar文件中。但我还是不知道怎么解决。我将在这里链接生成的. classpath(我猜是Eclipse生成的):

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
  <classpathentry kind="src" path="src/test/java" output="target/test-classes" including="**/*.java"/>
  <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
  <classpathentry kind="src" path="src/main/java" including="**/*.java"/>
  <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
  <classpathentry kind="output" path="target/classes"/>
  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/Java SE 8 [1.8.0_121]"/>
  <classpathentry kind="var" path="M2_REPO/io/netty/netty-all/4.1.30.Final/netty-all-4.1.30.Final.jar" sourcepath="M2_REPO/io/netty/netty-all/4.1.30.Final/netty-all-4.1.30.Final-sources.jar"/>
  <classpathentry kind="var" path="M2_REPO/javassist/javassist/3.12.1.GA/javassist-3.12.1.GA.jar" sourcepath="M2_REPO/javassist/javassist/3.12.1.GA/javassist-3.12.1.GA-sources.jar"/>
</classpath>

共有2个答案

景同
2023-03-14

你错过了类路径。Eclipse管理自己的类路径,这就是它在Eclipse中工作的原因。

创建可由java-jar简单执行的jar文件的最简单方法是使用maven shade插件。您可以查看有关如何使用maven shade插件创建可执行jar的文档。

更新:您需要配置要包含在着色jar中的工件,如下所述。例如,如果希望包含所有依赖项(包括可传递项),可以执行以下操作:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.4</version>
    <configuration>
       <artifactSet>
          <includes>
             <include>*:*</include>
          </includes>
       </artifactSet>
       <shadedArtifactAttached>false</shadedArtifactAttached>
    </configuration>
    <executions>
        <execution>
        <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <manifestEntries>
                            <Main-Class>paplistener.PAPServer</Main-Class>
                            <Build-Number>1</Build-Number>
                        </manifestEntries>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
 </plugin>

您可以在文档页面中看到所有可用的配置https://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html

章高朗
2023-03-14

插件元素不应在内部版本中-

<project>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>3.2.4</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <transformers>
              <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>com.mycompany.app.App</mainClass>
              </transformer>
            </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</project>
 类似资料:
  • 尝试将我的java应用程序从Eclipse导出到可运行的jar文件中。(这是一个控制台应用程序) 这是Eclipse中项目目录的外观: 以下是项目的运行配置: 这就是jar创建选项的外观: 最后,这是我得到的错误: 我真的试过了所有的东西,但我很困惑为什么它不运行。主类选择正确,运行配置似乎正确,我尝试了runnable和regular,两者都不起作用。 我尝试过清理、重建,甚至重新制作这个项目,

  • 在src/main/groovy/foo/test2.java中: 分级文件: 我造了一个罐子: 我在这里有版本控制中的测试用例: https://github.com/wu-lee/test-groovy-main

  • 问题内容: 我正在学习Go,并且想尝试goroutine和频道。 这是我的代码: 结果如下: 我不明白为什么我的goroutine永远不会执行。没有输入“进入goroutine”,并且没有任何错误消息。 问题答案: 事实是您的goroutine开始执行,但是在执行任何操作之前就结束了,因为您的程序在打印后立即停止:goroutine的执行与主程序无关,但是将在与程序相同的位置处停止。因此,基本上,

  • 问题内容: 我正在尝试打开一个保存在源文件夹本身中的CSV文件名“ logger.csv”。 但是,这一直在给我一个“找不到文件”错误。 问题答案: 如果您现在就使用相对路径,则该文件需要存在于项目根目录中, 而不是 存在于java文件的目录中。 考虑以下层次结构: 不管用。 将 现在 的工作。(注意,该文件与src目录相邻。)

  • 问题内容: 我在asp.net项目的Content文件夹中有一个json文件: …以及访问它的代码: …但是调用代码时什么也没发生;浏览器控制台说:“无法加载资源:服务器响应状态为404(未找到)” 为什么找不到?“波浪号文件名”不是通往文件的正确路径吗? 更新 我还尝试了向后“重击”: …并且得到相同的结果(“ 无法加载资源:服务器以404(未找到)状态进行响应 ”) 更新2 然后,我尝试了这种

  • 我正试图用IntelliJ启动我的Java Gradle项目。 我和同事一样配置了Tomcat配置。 他们的项目建设得很好。 当我开始构建时,我在构建选项卡中看到以下内容。 它没有超出编写类的范围。 我的应用程序中没有任何ant任务。我只使用Gradle进行依赖关系管理。但出于某种原因,IntelliJ运行了一些Ant任务,并试图“编写”一些类。 构建在此之后挂起,大约3分钟后发生内存异常。只有我