gpt4 book ai didi

java - Maven 构建带有依赖项的 jar

转载 作者:行者123 更新时间:2023-12-02 02:40:03 25 4
gpt4 key购买 nike

我正在使用 Maven Swing 应用程序,但在构建时遇到了一些问题。

环境

我正在使用 Netbeans 8.2 作为 IDE 和 Jasper Reports 库来开发我的应用程序,以根据已编译的 .jasper 文件生成一些 PDF 报告,这些文件是使用 Jaspersoft Studio 6.3.1 和 Jaspersoft Studio 6.3.1 单独生成的然后在我的项目中被用作资源。

我的项目的pom如下(具有相关信息的专家):

<project>
<!-- Needed for jasperreports-functions -->
<repositories>
<repository>
<id>jr-ce-releases</id>
<url>http://jaspersoft.artifactoryonline.com/jaspersoft/jr-ce-releases</url>
</repository>
</repositories>

<dependencies>
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.4.0</version>
</dependency>

<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports-functions</artifactId>
<version>5.2.0</version>
</dependency>

<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.12</version>
</dependency>

<!-- The driver I need for connecting to my DB -->
<dependency>
<groupId>com.ibm.informix</groupId>
<artifactId>jdbc</artifactId>
<version>4.10.8.1</version>
</dependency>

<!-- some other test dependencies -->
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<mainClass>ar.edu.unt.gui.MainFrame</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>

<!-- I exclude the Jasper XML as I only need .jasper files in my project -->
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>*.jrxml</exclude>
</excludes>
</resource>
</resources>
</build>
</project>

问题

使用此配置,我可以通过右键单击项目 -> 清理和构建选项从 Netbeans 运行项目,这相当于 mvn clean install。该应用程序编译时没有错误,我可以使用菜单中的 Run -> Run project 选项从 IDE 运行它,并且它会成功执行。打包后的jar包含以下内容:

project screenshot

如您所见,依赖项并未打包在 jar 中。这是不可取的,因为我需要应用程序是独立的,即我需要将 jar 复制到另一台计算机中并且我必须能够运行它。

为了进行测试,我尝试从控制台运行应用程序:我移动到 target/ 文件夹,然后从那里运行

java -jar certificado-titulos-unt-1.0.jar

出现错误

java.lang.NoClassDefFoundError: net/sf/jasperreports/engine/JRException
at ar.edu.unt.gui.MainFrame.<init>(MainFrame.java:45)
...
Caused by: java.lang.ClassNotFoundException: net.sf.jasperreports.engine.JRException
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
...

正如我所料,这不起作用,因为我在开发环境之外,并且依赖项没有打包在 jar 中。 这就是问题

解决方案尝试

我找到了this answer并按照建议添加了 maven-assemble-plugin 配置并获得了一个 jar。显然包含依赖项,因为我没有 ClasNotFoundError。问题是,通过此构建,我的代码无法获取某些资源文件 conexion.properties,因此这种方法没有用。另外,使用此配置,我无法看到包的内容,也无法解压缩它,至少使用我的解压缩实用程序是这样。

总结

所以,总而言之,我无法配置 maven 将所有依赖项(基本上是具有传递依赖项的 jasper-reportsgroovy)打包到我的应用程序中克服ClassNotFoundError。非常感谢任何对此的帮助。

提前感谢您的回答

最佳答案

Shade Plugin提供创建 uber jar 的功能。也就是说,包含项目的类以及项目运行时依赖项中的类的 jar。

通过在 POM 的构建部分声明插件并将其绑定(bind)到包构建阶段来启用插件的基本用法:

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

要构建 uber jar,请使用包目标运行 Maven

mvn package

成功后,目标目录中的最终 jar 将是 uber jar。

关于java - Maven 构建带有依赖项的 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45644814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com