Ste*_*ins 8 java maven-2 netbeans
我在NetBeans中启动了一个新的Maven项目,接受了所有默认设置.将所有JAR依赖项剥离出来的POM在此问题的底部被剪切粘贴.
应用程序读入各种属性文件(例如,日志记录和配置).它还可读取字体,图像和声音等外部资源.我不希望将所有这些资源捆绑到JAR文件中.相反,我计划将它们部署在部署JAR的目录下的子目录中.
项目目录结构的简化视图如下所示:
-src
|---main
|---java
|---com.mypackage, etc
|---resources
|---conf
|---fonts
|---images
|---sounds
+target
Run Code Online (Sandbox Code Playgroud)
我会喜欢一个干净的构建是这样以后有:
+src
-target
|---myproject-1.0.0.jar (compiled contents of "src/main/java" ONLY)
|---conf
|---fonts
|---images
|---sounds
Run Code Online (Sandbox Code Playgroud)
但是,当我通过NetBeans(或命令行)执行"清理并构建"或"执行"时......我实际得到的内容如下所示:
+src
-target
|---classes
|---("src/main/java" and "src/main/resources" slammed together)
|---myproject-1.0.0.jar (the "classes" subdirectory JAR'ed up)
Run Code Online (Sandbox Code Playgroud)
有人能指出我正确的方向获得第一个结果而不是第二个结果吗?如果这是一个愚蠢的问题(我是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>
...
Run Code Online (Sandbox Code Playgroud)
New*_*ian 11
虽然提出的解决方案可行,但它们基本上围绕着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>
Run Code Online (Sandbox Code Playgroud)
这将有效地将它们从罐子中排除而没有任何变通方法.
这是jar插件的doc页面.
虽然以上内容将回答您的问题,但我可以建议一些额外的可能性,以帮助您的努力.作为第二步,仍然可以使这些资源可用,您可以使用程序集插件打包您的项目.这将允许您创建一个zip文件并将所有文件,资源和jar放在适当的位置,以便在解压缩zip时,所有内容都会到位.
如果这个项目是一个大型工作的一部分你仍然可以使用程序集插件,你可能会遇到这种情况,在主项目中,你可以提取并重新组装它们在一个更大的zip中,包括所有必要的工件.
最后,我建议您将目录结构保留在目标下.如果你自定义它,最好通过Maven变量来完成它,以便更改渗透到其他插件.如果您在Maven完成后手动删除并重命名内容,则可能会在以后遇到问题.通常情况下,如果您按照自己的方式配置它,Maven jar插件应该能够正确使用它,这样您就不必担心目标是什么了.就个人而言,我使用Eclipse,并且pusign非常适合让IDE和Maven配置同步.对于NetBeans,我怀疑这也是如此.如果不是,最好的方法是在NetBeans中配置项目,将目标/类用作构建工件的目标文件夹,并将目标/测试类用于从src/test/java构建的东西.
就个人而言,我不会使用资源的默认位置,而是使用"额外"位置,并配置资源插件将它们从那里复制到您想要的位置:
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<id>copy-resources</id>
<!-- here the phase you need -->
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target</outputDirectory>
<resources>
<resource>
<directory>src/non-packaged-resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
...
</build>
...
</project>
Run Code Online (Sandbox Code Playgroud)
如果你坚持使用默认位置(src/main/resources),我认为你必须配置一些排除(见下文)以避免资源被默认复制,然后使用与上面相同的方法.
另一种选择是使用AntRun maven插件和Ant来移动文件,但这不是真正的maven方式所以我不会详细说明.
| 归档时间: |
|
| 查看次数: |
16854 次 |
| 最近记录: |