【问题标题】:Maven Assembly: Unabe to run fat jarMaven 程序集:无法运行 fat jar
【发布时间】:2016-09-12 23:05:20
【问题描述】:

我使用 maven 程序集插件创建了一个胖 jar。以下是隐藏了一些敏感细节的 pom 文件:-

<modelVersion>4.0.0</modelVersion>
<groupId>labs.rule</groupId>
<artifactId>labs-engine</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Labs Engine</name>
<description>Rule engines @ XXX</description>
<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4.1</version>
            <configuration>
                <!-- get all project dependencies -->
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <!-- MainClass in mainfest make a executable jar -->
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>main.java.labs.RuleEngine</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <!-- bind to the packaging phase -->
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
<!-- distributionManagement entry is for enabling upload to bidstalk maven
                    repos -->
<repositories>
    <repository>
        <id>My-maven-repository</id>
        <name>My-maven-repository-releases</name>
        <url>http://X.Y.Z.W:ZZZ/artifactory/simple/My</url>
    </repository>
    <repository>
        <id>sonatype-forge</id>
        <url>https://repository.sonatype.org/content/groups/forge/</url>
    </repository>
</repositories>
<distributionManagement>
    <snapshotRepository>
        <id>My-maven-repository</id>
        <name>My-maven-repository-snapshots</name>
        <url>http://X.Y.Z.W:ZZZ/artifactory/simple/My</url>
    </snapshotRepository>
</distributionManagement>
<dependencies>
    <dependency>
        <groupId>commons-cli</groupId>
        <artifactId>commons-cli</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>commons-net</groupId>
        <artifactId>commons-net</artifactId>
        <version>3.3</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.3</version>
    </dependency>
    <dependency>
        <groupId>commons-configuration</groupId>
        <artifactId>commons-configuration</artifactId>
        <version>1.10</version>
    </dependency>
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.1</version>
    </dependency>
    <dependency>
        <groupId>commons-httpclient</groupId>
        <artifactId>commons-httpclient</artifactId>
        <version>3.1</version>
    </dependency>
    <dependency>
        <groupId>com.aerospike</groupId>
        <artifactId>aerospike-client</artifactId>
        <version>3.1.9</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-redshift</artifactId>
        <version>1.11.31</version>
    </dependency>
    <dependency>
        <groupId>com.applift.commonslib</groupId>
        <artifactId>alertslib</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>com.amazon</groupId>
        <artifactId>redshift.jdbc41</artifactId>
        <version>1.1.13.1013</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.34</version>
    </dependency>
</dependencies>
</project>

我可以从 eclipse 运行代码,但我需要部署一个 fat jar,这是我在打包阶段在 maven 中创建的。

但是,当我尝试使用以下方式运行 jar 时:-

java -jar target/labs-engine-0.0.1-SNAPSHOT-jar-with-dependencies.jar

它给出了以下异常:-

Exception in thread "main" java.sql.SQLException: No suitable driver found for jdbc:mysql://X-Y-Z.com:3306/labs_staging

现在我在创建胖罐子时缺少什么?请注意:-

  1. mysql-connector 被包含在 pom.xml 中。
  2. 我可以在 Eclipse 中运行
  3. com.mysql.jdbc 包存在于创建的 fat jar 中。

编辑: mvn clean install的输出

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Labs Engine 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ labs-engine ---
[INFO] Deleting /Users/mangat/Documents/workspace/labs-rule-engine/target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ labs-engine ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/mangat/Documents/workspace/labs-rule-engine/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ labs-engine ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 8 source files to /Users/mangat/Documents/workspace/labs-rule-engine/target/classes
[WARNING] /Users/mangat/Documents/workspace/labs-rule-engine/src/main/java/labs/RuleEngineAerospikeConnection.java: /Users/mangat/Documents/workspace/labs-rule-engine/src/main/java/labs/RuleEngineAerospikeConnection.java uses unchecked or unsafe operations.
[WARNING] /Users/mangat/Documents/workspace/labs-rule-engine/src/main/java/labs/RuleEngineAerospikeConnection.java: Recompile with -Xlint:unchecked for details.
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ labs-engine ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/mangat/Documents/workspace/labs-rule-engine/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ labs-engine ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ labs-engine ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ labs-engine ---
[INFO] Building jar: /Users/mangat/Documents/workspace/labs-rule-engine/target/labs-engine-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- maven-assembly-plugin:2.4.1:single (make-assembly) @ labs-engine ---
[INFO] Building jar: /Users/mangat/Documents/workspace/labs-rule-engine/target/labs-engine-0.0.1-SNAPSHOT-jar-with-dependencies.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ labs-engine ---
[INFO] Installing /Users/mangat/Documents/workspace/labs-rule-engine/target/labs-engine-0.0.1-SNAPSHOT.jar to /Users/mangat/.m2/repository/labs/rule/labs-engine/0.0.1-SNAPSHOT/labs-engine-0.0.1-SNAPSHOT.jar
[INFO] Installing /Users/mangat/Documents/workspace/labs-rule-engine/pom.xml to /Users/mangat/.m2/repository/labs/rule/labs-engine/0.0.1-SNAPSHOT/labs-engine-0.0.1-SNAPSHOT.pom
[INFO] Installing /Users/mangat/Documents/workspace/labs-rule-engine/target/labs-engine-0.0.1-SNAPSHOT-jar-with-dependencies.jar to /Users/mangat/.m2/repository/labs/rule/labs-engine/0.0.1-SNAPSHOT/labs-engine-0.0.1-SNAPSHOT-jar-with-dependencies.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12.707 s
[INFO] Finished at: 2016-09-12T20:13:32+05:30
[INFO] Final Memory: 43M/379M
[INFO] ------------------------------------------------------------------------

【问题讨论】:

  • 您可能缺少查找适当 jdbc 驱动程序的 ServiceLocator 所需的配置文件。
  • @PeterLawrey 我还没有创建任何配置文件。在创建 jax 可执行文件时我需要一个吗?我正在通过 Class.forName("com.mysql.jdbc.Driver"); 加载驱动程序;
  • 如果你明确加载它,你不应该还需要服务定位器配置文件,但我可能是错的。我不确定当您组合 JAR 时,此文件或元数据中的某些其他资源不会被破坏。
  • 尝试从target目录运行它。
  • 在你的依赖中你有文件java.sql.Driver吗?如果此文件多次出现,它将被覆盖。

标签: java maven jar


【解决方案1】:

尝试下一个修补程序。

将下一个内容添加到您的项目资源META-INF/services/java.sql.Driver 文件中:

com.mysql.jdbc.Driver
com.mysql.fabric.jdbc.FabricMySQLDriver

在构建后确保*-jar-with-dependencies.jar 文件(它是普通的 zip 文件,将其重命名以查看内部)包含正确内容的文件。

这不是最好的解决方案,但如果有帮助,我们可以找到更好的解决方案。

【讨论】:

  • 我确实这样做了,但发现“com.amazon.redshift.jdbc41.Driver”作为文件的内容。现在我需要两个驱动程序。我也在用红移。
  • 如果您需要多个驱动程序,您应该重新考虑使用 fat jar。
  • 糟糕,我卡住了。因为我需要在 Amazon EC2 上部署 Java 应用程序并且它只需要一个胖 jar 来执行。
  • 有一个解决方案可以解决您的问题。你需要写正确的assembli.xml,但我帮不了你。很久没做了。你可以从这里开始maven.apache.org/plugins/maven-assembly-plugin/usage.html
  • 非常感谢@talex 的所有帮助。只需在 redshift 之前交换加载 mysql 驱动程序即可动态解决该问题。现在我正在阅读有关该项目的 assembli.xml 的信息。
猜你喜欢
  • 2018-02-09
  • 2016-12-15
  • 1970-01-01
  • 2014-09-19
  • 2021-09-05
  • 2014-07-16
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
相关资源
最近更新 更多