0

我有一个 Scala 应用程序,我正在尝试使用 Maven 将其打包为 .jar 文件。我正在尝试将一个 application.conf 文件作为资源打包到 jar 中。但是,当我使用资源插件时,或者通过将资源自动放入 src/main/resources 中,或者通过将其从其他文件夹显式添加到 pom.xml 中,Maven 然后停止编译和打包 jar 中的 .class 文件。

只要我不使用资源插件,一切都会 100% 运行。Maven 运行 Scala 编译器,将 .class 文件放入 jar 中,通过 7zip 手动添加我的资源后,程序执行得很好。

一些额外的细节:

  • 我正在使用带有 Artima Supersafe 编译器插件的 scala-maven-plugin
  • 我还使用 maven-shade-plugin 生成一个 fat jar,连接 akka reference.conf 文件,并生成清单。这在使用资源插件时仍然有效,只是我的.class 文件丢失了。我试过在没有这个插件的情况下运行,但结果完全相同。
  • 我手动将 sourceDirectory 指定为 src/main/scala
  • 当不使用资源插件时,Scala 编译并且控制台输出显示[INFO] --- scala-maven-plugin:3.2.0:compile (default) @ batchmanager ---,然后是编译器警告等。但是,当使用资源插件时,它总是坚持:[INFO] Nothing to compile - all classes are up to date
  • 使用资源插件时,application.conf 文件确实正确出现在 jar 中
  • 我通过 Eclipse 运行 Maven,而不是 CLI

我感觉资源插件有一些我不明白的地方。任何帮助将非常感激。

完整的 pom.xml(删除资源定义是文件的工作版本和非工作版本之间的唯一区别)

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.digitalalbatross</groupId>
    <artifactId>batchmanager</artifactId>
    <version>0.0.1</version>
    <name>${project.artifactId}</name>
    <inceptionYear>2017</inceptionYear>
    <licenses>
        <license>
            <name>My License</name>
            <url>http://....</url>
            <distribution>repo</distribution>
        </license>
    </licenses>

    <properties>
        <maven.compiler.source>1.6</maven.compiler.source>
        <maven.compiler.target>1.6</maven.compiler.target>
        <encoding>UTF-8</encoding>
        <scala.version>2.12.2</scala.version>
        <scala.compat.version>2.12</scala.compat.version>
    </properties>

    <repositories>
        <repository>
            <id>artima</id>
            <name>Artima Maven Repository</name>
            <url>http://repo.artima.com/releases</url>
        </repository>
    </repositories>

    <dependencies>

        <!-- Test -->
        <dependency>
            <groupId>com.typesafe.akka</groupId>
            <artifactId>akka-http_2.12</artifactId>
            <version>10.0.7</version>
            <exclusions>
                <exclusion>
                    <groupId>org.scala-lang</groupId>
                    <artifactId>scala-library</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.iq80.leveldb</groupId>
            <artifactId>leveldb</artifactId>
            <version>0.9</version>
        </dependency>
        <dependency>
            <groupId>org.fusesource.leveldbjni</groupId>
            <artifactId>leveldbjni-all</artifactId>
            <version>1.8</version>
        </dependency>
        <dependency>
            <groupId>com.typesafe.akka</groupId>
            <artifactId>akka-actor_2.12</artifactId>
            <version>2.5.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.scala-lang</groupId>
                    <artifactId>scala-library</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.typesafe.akka</groupId>
            <artifactId>akka-persistence_2.12</artifactId>
            <version>2.5.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.scala-lang</groupId>
                    <artifactId>scala-library</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.typesafe.akka</groupId>
            <artifactId>akka-stream_2.12</artifactId>
            <version>2.5.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.scala-lang</groupId>
                    <artifactId>scala-library</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.typesafe.akka</groupId>
            <artifactId>akka-http-spray-json_2.12</artifactId>
            <version>10.0.6</version>
            <exclusions>
                <exclusion>
                    <groupId>org.scala-lang</groupId>
                    <artifactId>scala-library</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.scalatest</groupId>
            <artifactId>scalatest_2.12</artifactId>
            <version>3.0.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.scala-lang</groupId>
                    <artifactId>scala-library</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>2.12.2</version>
        </dependency>
    </dependencies>

    <build>

        <sourceDirectory>src/main/scala</sourceDirectory>
        <testSourceDirectory>src/test/scala</testSourceDirectory>

        <resources>
            <resource>
                <directory>res</directory>
                <includes>
                    <include>application.conf</include>
                </includes>
            </resource>
        </resources>


        <plugins>
            <plugin>
                <!-- see http://davidb.github.com/scala-maven-plugin -->
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>testCompile</goal>
                        </goals>
                        <configuration>
                            <compilerPlugins>
                                <compilerPlugin>
                                    <groupId>com.artima.supersafe</groupId>
                                    <artifactId>supersafe_${scala.version}</artifactId>
                                    <version>1.1.2</version>
                                </compilerPlugin>
                            </compilerPlugins>
                            <args>

                                <arg>-dependencyfile</arg>
                                <arg>${project.build.directory}/.scala_dependencies</arg>
                            </args>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.18.1</version>
                <configuration>
                    <useFile>false</useFile>
                    <disableXmlReport>true</disableXmlReport>
                    <!-- If you have classpath issue like NoDefClassError,... -->
                    <!-- useManifestOnlyJar>false</useManifestOnlyJar -->
                    <includes>
                        <include>**/*Test.*</include>
                        <include>**/*Suite.*</include>
                    </includes>
                </configuration>
            </plugin>



            <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>
                        <configuration>
                            <shadedArtifactAttached>true</shadedArtifactAttached>
                            <shadedClassifierName>allinone</shadedClassifierName>
                            <artifactSet>
                                <includes>
                                    <include>*:*</include>
                                </includes>
                            </artifactSet>
                            <transformers>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>reference.conf</resource>
                                </transformer>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <manifestEntries>
                                        <Main-Class>com.digitalalbatross.batchmanager.Boot</Main-Class>
                                    </manifestEntries>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>
    <description>Batch Manager for IMAX</description>
    <organization>
        <name>Digital Albatross Design and Consulting</name>
        <url>digitalalbatross.com</url>
    </organization>
</project>
4

1 回答 1

0

在解决另一个问题的过程中,我设法解决了我的问题。我的 Eclipse 工作台在启动时一直崩溃,所以我删除了 .plugins 文件夹以尝试解决问题。这不仅修复了我的 Eclipse 设置,而且 Maven 决定合作并开始在 jar 中实际包含资源和类文件。在对哪些生成的 jar 文件实际上有一个工作清单感到困惑之后,我已经验证它现在按预期工作。

总而言之,这很可能是我的 .plugins eclipse 文件夹中的某些东西引起的一些奇怪的错误。删除该文件夹并重新配置我的设置解决了这个问题。

于 2017-07-10T15:23:15.107 回答