java - 在由 Maven 驱动的简单演示应用程序的 JAR 中包含 Postgres 的 JDBC 驱动程序

标签 java maven jdbc jar dependencies

如何使 Maven 包含 JDBC driver for Postgres在我的应用程序的 .jar 文件中?

我将此依赖项元素添加到 <dependencies>我的 POM 中的元素。

<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
  <groupId>org.postgresql</groupId>
  <artifactId>postgresql</artifactId>
  <version>42.2.8</version>
</dependency>

IntelliJ IDE 显示驱动程序已成功下载,因为它列在我的 Project 的“外部库”项中 Pane 。我的代码可以使用 JDBC 类,例如 PGSimpleDataSource

当我构建时,如果我查看生成的 .jar文件中,不包含 JDBC 驱动程序。

我的项目是由Maven驱动的,使用 maven-archetype-quickstart 原型(prototype)。我确实将 POM 中的所有版本号更新为最新。我唯一的其他更改是添加以下内容以获取 JAR 的 list 文件以指定 main类。

                    <configuration>
                        <archive>
                            <manifest>
                                <mainClass>work.basil.example.App</mainClass>
                            </manifest>
                        </archive>
                    </configuration>

我认为 Maven 默认情况下会将所有依赖项捆绑到生成的 JAR 文件中。这就是我在构建 Vaadin Web 应用程序时看到的行为。更普遍的情况不正是如此吗?或者 JDBC 驱动程序是否特殊并且由于某种原因被省略。

如果有帮助,这里是整个 POM。

<?xml version="1.0" encoding="UTF-8"?>

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>tryjdbc</artifactId>
    <version>1.0-SNAPSHOT</version>

    <name>tryjdbc</name>
    <description>A simple tryjdbc.</description>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>13</maven.compiler.source>
        <maven.compiler.target>13</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.6.0-M1</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.8</version>
        </dependency>


    </dependencies>

    <build>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-site-plugin</artifactId>
                    <version>3.8.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-project-info-reports-plugin</artifactId>
                    <version>3.0.0</version>
                </plugin>
                <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>3.0.0-M3</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>3.1.2</version>
                    <configuration>
                        <archive>
                            <manifest>
                                <mainClass>work.basil.example.App</mainClass>
                            </manifest>
                        </archive>
                    </configuration>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>3.0.0-M1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>3.0.0-M1</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

    <reporting>
        <plugins>
            <plugin>
                <artifactId>maven-project-info-reports-plugin</artifactId>
            </plugin>
        </plugins>
    </reporting>
</project>

最佳答案

.war文件(例如您在构建 Vaadin Web 应用程序时看到的文件)默认包含依赖项。

相比之下,.jar默认情况下,Maven 构建的文件包含任何依赖项。

您可以使用插件,例如 maven-shade-plugin创建一个阴影 jar,其中包含依赖项:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.1</version>
        <configuration>
          <!-- put your configurations here -->
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

更多示例可以在 Apache Maven Shade Plugin 上找到。项目页面。

关于java - 在由 Maven 驱动的简单演示应用程序的 JAR 中包含 Postgres 的 JDBC 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58761760/

相关文章:

java - 通过 Hybris 中的 cronjob 发布或取消部署促销

java - java实现下拉刷新的方法

java - 具有单独测试模块的 Maven 多模块项目 - 代码覆盖率?

jdbc - Debezium/JDBC 和 Kafka 主题保留

java - Solaris 5.10 上的 UnsupportedCharsetException : IS646-US with JDK 1. 8u51

java - Android http post 到 ASP.NET Web API 不插入数据

java - 如何防止 Maven Java 中的文件从特定包导入

javascript - 在maven Spark java应用程序中运行html文件

Maven 3和JUnit 4编译问题: package org. junit不存在

java - 使用JDBC BatchUpdate向数据库中插入100万条记录。每行包含6个特定值,以“#”分隔。