了解Maven依赖项和程序集

时间:2018-12-16 00:12:42

标签: java maven

我对Maven的经验不是很丰富,它的编译和打包逻辑使我感到困惑。

我有一些依赖项声明为:

<dependency>
  <groupId>com.dependency_group</groupId>
  <artifactId>dependency_1</artifactId>
  <version>1.0.0</version>
</dependency>


<dependency>
  <groupId>com.dependency_group</groupId>
  <artifactId>dependency_2</artifactId>
  <version>1.0.0</version>
  <scope>provided</scope>
</dependency>

据我所知,dependency_1将作为jar附带的内容添加到程序的类路径中,而dependency_2将添加到类路径中作为系统运行时将在部署时提供的内容。

然后,我运行Maven的package目标,并且我的依赖项都没有包装我的代码(我正在使用shade插件,但即使没有它也没有任何变化)。

我希望当某些依赖项设置为compile scope时,它将与我的编译代码一起导出,因为自AFAICS以来,没有必要设置类路径来说依赖项会与我的代码一起出现代码,而Maven只是不将依赖关系与其打包在一起。在我看来,Maven并未遵守合同。

所以:

1-这背后的逻辑是什么?

2-我是否必须始终使用Assembly插件?

3-在某些情况下,人们会将依赖项定义为compile而不希望将其打包在jar中吗?

2 个答案:

答案 0 :(得分:2)

让我阐明这里的要点。从根本上讲,有两种Java工件:

  1. 应用程序,即耳朵,战争,可执行jars
  2. 库,即要用作其他工件依赖项的jars。

对于应用程序,您的推理非常合理。 Wars and Ears自动打包其所有编译依赖项,因此您不需要任何汇编插件。对于库,请勿将依赖项打包到库中。 Maven处理传递依赖解析,如果在类路径上放了一个胖子,就会感到困惑。

问题在于包装jar可以是一个库,也可以是一个应用程序。如果您想要一个独立的应用程序,则需要告诉Maven打包所有内容,例如通过使用Assembly插件或shade插件。

答案 1 :(得分:0)

当您希望代码附带一些依赖项时,可以使用filename = "myFile.csv" # don't want to overwrite original new_filename = "newFile.csv" def LEFT(s, length): # example: LEFT("apple",3) returns "app". return str(s[:length]) def MID(s, start, length): # example: MID("apple",2,3) returns "ppl" return str(s[start - 1: start - 1 + length]) # read file contents into list with open(filename, 'r') as file: # store file data in a list file_data = file.read().splitlines() # loop and append new data to list for i, line in enumerate(file_data): # ignore header if (i == 0): continue; # parse 2nd column second_column = line.split(",")[1] # append 5th and 6th column file_data[i] += "," + LEFT(second_column, 2) \ + "," + MID(second_column, 4, 2) # write modified list to new file with open(new_filename, 'w') as file: for line in file_data: file.write(line + '\n') 范围。例如,如果您想将compile用作应用程序的一部分,则将其用于json序列化。

如果希望在编译期间将依赖项放在类路径上,但不将其包含在应用程序中,则使用Jackson范围。它必须由运行环境提供。例如,您希望provided是仅编译库,或者您希望在编写servlet应用程序时提供Lombok依赖性,因为此类应用程序将在servlet容器上运行,因此无需将其打包到您的应用程序中(它将在容器运行时中提供)

  

我是否必须始终使用Assembly插件

没有人强迫你这样做。