[英]maven build jar with dependencies
我正在使用Maven Swing应用程序,但建筑物存在一些问题。
我正在使用Netbeans 8.2作为IDE和Jasper Reports库来开发我的应用程序,以基于已编译的.jasper
文件生成一些PDF报告,这些文件是使用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>
通过这种配置,我可以通过右键单击 project- > Clean and Build选项 ,从Netbeans运行该项目,该选项等效于mvn clean install
。 该应用程序编译没有错误,我可以使用菜单中的“运行”->“运行项目”选项从IDE中运行它,并且可以成功执行。 包装好的罐子包含以下内容:
如您所见,依赖关系没有打包在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中。 这就是问题
我找到了这个答案,并按照那里的建议添加了maven-assembly-plugin
配置,并获得了一个jar。 显然包含依赖项,因为我没有ClasNotFoundError
。 问题在于,使用此构建,我的代码无法获取一些资源文件conexion.properties
,因此该方法没有用。 另外,使用这种配置,至少通过我的unzip实用程序,我无法看到包的内容或将其解压缩。
因此,总而言之,我无法配置maven来打包我的应用程序中的所有依赖项(基本上是jasper-reports
和groovy
以及可传递的依赖项),以克服ClassNotFoundError
。 对此,我们将给予任何帮助。
预先感谢您的回答
Shade插件提供了创建超级jar的功能。 也就是说,包含项目类以及项目运行时依赖项中的类的jar。
通过在POM的build部分中声明该插件并将其绑定到软件包构建阶段,可以启用该插件的基本用法:
<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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.