用Maven组装java项目

用Maven组装java项目,java,maven,assemblies,Java,Maven,Assemblies,我的问题有三个部分,短,长和附加。我将从简短的一个开始: 有没有什么好的教程/示例,如何组装一些典型的(例如类似apache的组装?)我的意思是,教程将介绍如何使用eclipse开发应用程序,并最终使其进入良好的目录结构,如: bin conf lib LICENSE.txt 问题的长部分是:如何适当地放置log4j.properties,而不破坏最终组装?我知道有很多答案,比如“把它放到src/main/resources中”,我做到了,现在它正在开发中。我将所有配置文件放入src/main/

我的问题有三个部分,短,长和附加。我将从简短的一个开始:

有没有什么好的教程/示例,如何组装一些典型的(例如类似apache的组装?)我的意思是,教程将介绍如何使用eclipse开发应用程序,并最终使其进入良好的目录结构,如:

bin
conf
lib
LICENSE.txt

问题的长部分是:如何适当地放置log4j.properties,而不破坏最终组装?我知道有很多答案,比如“把它放到src/main/resources中”,我做到了,现在它正在开发中。我将所有配置文件放入src/main/resources,因为我只是通过类路径(.getClassLoader().getResourceAsStream(name);)加载配置文件,我认为这是最佳实践。但是当我把它放到src/main/resources文件夹中时,当我运行mvn包时,log4j.properties就会被放入jar中。但那不是我想要的。我想要一个干净的罐子,当软件打包后,log4j.properties将位于conf目录中,conf目录将位于类路径上


另外一个问题是:我通过类路径解决配置加载的方法好吗?我的想法是,我希望避免因开发/生产路径差异而陷入麻烦。当我假设配置将在CP上时,一切都变得容易多了。

我将对关于如何加载配置文件的最后一部分进行评论。将配置文件放入类路径在Java中使用得相当广泛。如果配置在部署时是固定的,并且文件可以嵌入jar中,那么这种方法效果很好,但是根据我的经验,如果配置以后需要更改,那么这种方法会带来更多的麻烦

这主要有两个原因。首先,这使得准确知道实际使用的配置文件和调试配置问题变得更加困难。类路径中可能包含多个目录,jar(或另一个jar)中可能有文件等。类加载是Java中比较困难的主题之一,对于那些实际应该更改配置的人来说,类加载和类路径通常是一个不透明的主题。最好在配置文件应该位于的位置有一个固定的位置,在日志文件中写入一行,并在文件丢失时创建一个错误

其次,类路径中的配置文件有时放在与读取该文件的类相匹配的包中。对于类路径资源来说,这是一种自然的最佳实践,但它要求您在配置所在的目录中创建一组匹配的文件夹。这使得那些应该创建或编辑文件的人更加困难


Log4j提供了一个选项,您可以在启动java时在命令行上指定Log4j文件。我总是使用该选项来指定log4j配置文件的确切位置

使用通过组合依赖项、类、src、资源和工件来创建归档文件,如果您认为合适的话。

那么,您建议如何解决典型应用程序在开发过程中的配置加载问题,以及如何过渡到生产环境?我的配置文件在拆卸时肯定是不固定的。根据您的说法,我不应该将配置文件放在src/main/resources中。那在哪里呢?如何解决生产环境和开发环境中此配置文件的路径相关性?因为。。。。开发结构应该和生产结构有很大的不同。我就是这么看的。大多数应用程序都需要配置文件夹和数据文件夹。您可以将文件夹的位置指定为启动参数,也可以使用“已知”标准位置。也就是说,在Linux环境中,将配置文件放在/etc或用户主目录中是很常见的,而数据文件可能放在/var下的目录或用户主目录中。我更喜欢那个解决方案。嗯,是的,这似乎合乎逻辑。但在典型的应用程序中,如Casssandra、ApacheAnt或ApacheWeb服务器,您有conf目录,可以在那里设置东西,而不是在comon“etc”位置。他们如何使它透明?他们是否使用一些简单的方法,比如路径相对性?i、 e.:“../../conf/config.properties”