【问题标题】:maven build jar with dependenciesmaven 构建带有依赖项的 jar
【发布时间】:2018-01-20 12:55:59
【问题描述】:

我正在使用 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>

问题

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

如您所见,依赖项并未打包在 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-assembly-plugin 配置并获得了一个jar。显然包含依赖项,因为我没有 ClasNotFoundError。问题是通过这个构建我的代码无法获得一些资源文件conexion.properties,所以这种方法没有用。此外,使用此配置,我无法看到包的内容,也无法解压缩它,至少使用我的解压缩实用程序。

总结

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

提前感谢您的回答

【问题讨论】:

    标签: java maven dependency-management


    【解决方案1】:

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

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

    <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。

    【讨论】:

    猜你喜欢
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多