我对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
中吗?
答案 0 :(得分:2)
让我阐明这里的要点。从根本上讲,有两种Java工件:
对于应用程序,您的推理非常合理。 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插件
没有人强迫你这样做。