我有一个使用maven 3.5.2和OpenJDK-1.8.0构建的项目。 而且总是在Linux中启动tomcat服务器时出现错误:
请求的bean当前正在创建中:是否存在无法解析的 循环引用
我尝试查找.war文件中的差异,但没有发现任何差异。我发现问题是按zip存档(.war文件)中文件的顺序指出的。我完全发现此问题导致文件位于一个早期指向的.war中的.jar文件中。 我写了bash脚本来重新打包此.war文件,它运行完美。它在100%的情况下解决了这个问题。 就是这样:
#!/bin/bash
set -e
function unpack_jar(){
local DEPTH=$1
local DIR=$2
find "$DIR" -mindepth "$DEPTH" -maxdepth "$DEPTH" -type f -name "app*.jar" -print0 |
xargs -r0 -P 10 -n1 -I{} bash -c 'unzip -qo {} -d {}.unpacked && rm -f {}'
}
function pack(){
local DEPTH=$1
local DIR=$2
find "$DIR" -mindepth "$DEPTH" -maxdepth "$DEPTH" -type d -name "*.unpacked" -print0 | sort -z |.
xargs -r0 -P 10 -n1 -I{} bash -c 'F="{}"; echo "Packing $(basename ${F/%.unpacked/})"; pushd {} >/dev/null && find . -print | sort| zip -q "../$(basename "${F/%.unpacked/}")" -@ && popd >/dev/null && rm -rf {}'
}
FILE=$1
DEPTH=3
if [ ! -f "$1" ]; then
echo "There is no file"
else
DIR="${FILE/.*}"
echo "Unzipping $(basename "$FILE")"
unzip -qo "$FILE" -d "$DIR" && rm -r "$FILE"
for ((i=1; i<=DEPTH; i++));do
unpack_jar $i "$DIR"
done
for ((i=DEPTH; i>=1; i--)); do
pack "$i" "$DIR"
done
(cd "$DIR" && find . -print | sort | zip -q ../"$(basename "$FILE")" -@ ) &&
rm -rf "$DIR"
fi
实际上,此问题导致.jar文件中的文件顺序。在Windows中,它是按字母顺序排序的,而在Linux中则不是。在tomcat启动期间,类加载的顺序取决于在.war文件部署过程中其编写的顺序。 在打包它们之前,我需要强制按字母顺序排序文件和目录。 问题:是否可以使用maven选项对归档中的文件进行排序?还是可以提供另一种方法来获取存档中正确排序的文件而无需重新打包?