java - 让 Maven2 将资源复制到构建目录,但不将它们捆绑在 JAR 中

标签 java maven-2 netbeans

我在 NetBeans 中启动了一个新的 Maven 项目,接受所有默认设置。删除了所有 JAR 依赖项的 POM 被剪切粘贴在这个问题的底部。

应用程序读取各种属性文件(例如日志记录和配置)。它还读取外部资源,例如字体、图像和声音。我不希望将所有这些资源捆绑到 JAR 文件中。相反,我计划将它们部署在部署 JAR 的目录下的子目录中。

项目目录结构的简化 View 如下所示:

-src
   |---main
           |---java
                   |---com.mypackage, etc
           |---resources
                        |---conf
                        |---fonts
                        |---images
                        |---sounds
+target

希望在干净构建后拥有的内容如下所示:

+src
-target
       |---myproject-1.0.0.jar (compiled contents of "src/main/java" ONLY)
       |---conf
       |---fonts
       |---images
       |---sounds

但是,当我通过 NetBeans(或与此相关的命令行)执行“清理并构建”或“执行”时...我实际上得到的结果像这样:

+src
-target
       |---classes
                  |---("src/main/java" and "src/main/resources" slammed together)
       |---myproject-1.0.0.jar (the "classes" subdirectory JAR'ed up)

有人可以为我指明正确的方向以获得第一个结果而不是第二个结果吗?如果这是一个愚蠢的问题(我是 Maven 菜鸟),或者如果我忽略了之前提出的重复问题,我深表歉意。但是,从我在 Stack Overflow 上进行的搜索来看……似乎所有重复的问题都试图以其他方式进行! (即,将资源放入 JAR 而不是将它们放在外面)

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>steveperkins</groupId>
    <artifactId>myproject</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0</version>
    <name>My Project</name>
    <url>http://maven.apache.org</url>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <source>1.4</source>
                    <target>1.4</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
    ...

最佳答案

虽然建议的解决方案可行,但它们基本上围绕 maven 约定工作。更好的替代方法是过滤掉资源,这样它们就不会包含在 jar 中,但在 IDE 中工作时仍可作为资源使用。在 pom 中它应该是这样的:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <excludes>
                            <exclude>/conf/**</exclude>
                            <exclude>/fonts/**</exclude>
                            <exclude>/images/**</exclude>
                            <exclude>/sounds/**</exclude>
                        </excludes>
                    </configuration>
                </execution>
            </executions>
        </plugin>
   </plugins>
</build>

这将有效地将它们从 jar 中排除,没有任何解决方法。

Here是 jar 插件的文档页面。

虽然以上内容可以回答您的问题,但我可能会建议一些额外的可能性来帮助您努力。作为第二步,为了仍然使这些资源可用,您可以使用 assembly 打包您的项目。插入。这将允许您创建一个 zip 文件并将所有文件、资源和 jar 放在适当的位置,以便在解压缩 zip 时一切都到位。

如果这个项目是一个更大的工作的一部分,你仍然可以在每个你会遇到这种情况的地方使用 assembly 插件,并且在主项目中你可以将它们提取并重新组合成一个更大的 zip,包括所有必要的工件。

最后,我建议您保持目标下的目录结构不变。如果您自定义它,最好通过 Maven 变量进行自定义,以便更改渗透到其他插件。如果您在 Maven 完成后手动删除和重命名内容,您以后可能会遇到问题。通常,如果您按照自己的方式配置 Maven jar 插件,它应该能够正确运行,因此您无需担心目标下的内容。我个人使用 Eclipse,pusign 非常擅长同步 IDE 和 Maven 配置。对于 NetBeans,我怀疑情况也是如此。如果不是,最好的方法是在 NetBeans 中配置您的项目,以使用目标/类作为构建工件的目标文件夹,并使用目标/测试类作为从 src/test/java 构建的东西。

关于java - 让 Maven2 将资源复制到构建目录,但不将它们捆绑在 JAR 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4018394/

相关文章:

java - 是否可以使用 Netbeans 在 websphere 上进行热部署?

java - 如何为 NetBeans 创建自定义语言解析器?

java - maven构建文件,默认目录

java - 为什么一个执行两次而不是两个不同的 AsyncTasks?

java - Apache Flink 自定义触发器与ProcessingTimeSessionWindow

maven-2 - 在META-INF目录下添加生效的pom.xml

java - 主类执行maven或java命令

java - NetBeans 找不到 Applet 类

java - 如何初始化一个迭代器

java - 用于部署的 Maven、Java 和自定义文件