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

如何使用Maven将所有必需的JAR文件放入最终JAR文件的库文件夹中?

富凯旋
2023-03-14

我在独立应用程序中使用Maven,我想将所有依赖项打包到库文件夹中的JAR文件中,正如这里的答案之一所提到的:

如何使用Maven创建具有依赖项的可执行JAR?

我希望我的最终JAR文件有一个库文件夹,其中包含作为JAR文件的依赖项,而不是像maven-shade-plugin那样将依赖项以文件夹的形式放在.m2文件夹中的Maven层次结构。

实际上,当前的配置符合我的要求,但在运行应用程序时,我在加载JAR文件方面遇到了问题。我不能装类。

以下是我的配置:

<plugins>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
            <execution>
                <id>copy-dependencies</id>
                <phase>prepare-package</phase>
                <goals>
                    <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                    <outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
                    <overWriteReleases>false</overWriteReleases>
                    <overWriteSnapshots>false</overWriteSnapshots>
                    <overWriteIfNewer>true</overWriteIfNewer>
                </configuration>
            </execution>
        </executions>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
            <archive>
                <manifest>
                    <addClasspath>true</addClasspath>
                    <classpathPrefix>lib/</classpathPrefix>
                    <mainClass>com.myapp.MainClass</mainClass>
                </manifest>
            </archive>
        </configuration>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.6</source>
            <target>1.6</target>
        </configuration>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
            <execution>
                <id>install</id>
                <phase>install</phase>
                <goals>
                    <goal>sources</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.5</version>
        <configuration>
            <encoding>UTF-8</encoding>
        </configuration>
    </plugin>

</plugins>

项目在Eclipse中运行良好,并且JAR文件会根据我的需要放在最终JAR文件的库文件夹中,但是当从目标文件夹运行最终JAR文件时,我总是得到ClassNotFoundException:

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: com.myapp.MainClass. Program will exit.

如何修复此异常

共有2个答案

百里承业
2023-03-14

更新:

<build> 
  <plugins> 
    <plugin> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
      <execution> 
        <phase>install</phase> 
          <goals> 
            <goal>copy-dependencies</goal> 
          </goals> 
          <configuration> 
             <outputDirectory>${project.build.directory}/lib</outputDirectory> 
          </configuration> 
        </execution> 
      </executions> 
    </plugin> 
  </plugins> 
</build> 
融建树
2023-03-14

下面是我的解决方案。测试它是否适合您:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
                <overWriteReleases>false</overWriteReleases>
                <overWriteSnapshots>false</overWriteSnapshots>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <!-- <classpathPrefix>lib</classpathPrefix> -->
                <!-- <mainClass>test.org.Cliente</mainClass> -->
            </manifest>
            <manifestEntries>
                <Class-Path>lib/</Class-Path>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>

第一个插件将所有依赖项放在target//lib文件夹中,第二个插件将库文件夹包含在最终的JAR文件中,并配置manifest.mf文件。

但是您需要添加自定义的类加载代码来加载JAR文件。

或者,为了避免自定义类加载,您可以使用“${project.build.directory}/lib,但在这种情况下,在最终的JAR文件中没有依赖项,这就违背了目的。

问到这个问题已经两年了。然而,嵌套JAR文件的问题仍然存在。我希望这能帮上什么忙。

 类似资料:
  • 我在我的项目中使用了Maven和几个库,其中一些嵌套在最后的JAR文件中。 提前谢了。

  • 问题内容: 我正在使用Eclipse构建Java项目,该项目是使用Maven构建的。我使用的是旧项目中的一些再生代码,这些类之一在JAR文件夹中查找具有特定名称的文件,然后解析该文件的文本。在此特定示例中,它将查找具有Java接口名称的文件,然后从文件内部获取实现的类名称。 因此,基本上我想做的是 在JAR的“ META-INF / services”文件夹中包含一个文件名(X)和一行文本(Y)的

  • 我正在Eclipse中处理一个Java项目,该项目是使用Maven构建的。我使用的是一个旧项目中回收的代码,其中一个类在JAR的文件夹中查找具有特定名称的文件,然后解析该文件的文本。在这个特定的例子中,它查找一个名为Java接口的文件,然后从文件中获取实现的类名。 所以基本上,我要做的是在JAR的“META-INF/services”文件夹中包含一个文件,文件名为(X),一行文本为(Y)。我猜这应

  • 我正在为SAP hana云平台开发一个需要UnlimitedJCEPolicyJDK8的实现。文档告诉我需要将其置于以下结构下: WAR文件:meta-inf-ext_security-jre8 问题是,当我包含JAR时,它会转到WEB-INF/类,而服务器并不在这方面。如图所示。 尝试了以下操作: 使用eclipse web部署程序集添加文件(无论出于什么原因,它似乎不能与maven一起工作,是

  • 我有一个资源文件夹/包在我的项目的根,我"不"想要加载某个文件。如果我想加载某个文件,我会使用class.getResourceAsStream,我会没事的!!我实际上想做的是在资源文件夹中加载一个“文件夹”,循环该文件夹中的文件,并获得每个文件的流,并在内容中读取...假设在运行时之前没有确定文件名...那我该怎么办?有没有一种方法来获得一个文件夹中的文件列表在您的jar文件?请注意,带有资源的

  • 我想将一个jar文件导入到我的Android项目中。(这是jar文件) 以下是我的步骤: > 在清单中添加两行(类路径和主类)。MF文件<br>类路径:libs/nineldandroids-2.4.0.jar<br>主类:com.demos.tencent_qq_ui.Aty.MainActivity 在目录库中拖动jar文件 右键单击“添加为库” 重建项目- 但它发生了一个错误:无法找到或加载