У меня есть проект, который собирается с maven 3.5.2 и OpenJDK-1.8.0.И всегда, когда я запускал сервер tomcat в Linux, у меня появлялась ошибка:
Запрошенный компонент находится в процессе создания: существует неразрешимая циклическая ссылка
Я пытаюсьнайти разницу в .war файле, но ничего.Я обнаружил, что проблема указана в порядке файлов в zip-архиве (файл .war).Я полностью обнаружил, что эта проблема вызывает порядок файлов в одном файле .jar, расположенном в ранее указанном .war.Я написал 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?Или вы можете предложить другой способ получить правильно отсортированные файлы в архиве, не перепаковывая его?