Tratamento de erro de cabeçalho LOC inválido do Maven
1. Introdução
Às vezes, quando um jar em nosso repositórioMaven local está corrompido, veremos o erro:Invalid LOC Header.
Neste tutorial, vamos aprender quando isso acontece e como lidar comeven at times prevent it.
2. Quando ocorre o “cabeçalho LOC inválido”?
O Maven baixa as dependências de um projeto em um local conhecido em nosso sistema de arquivos chamadolocal repository. Todo artefato baixado pelo Maven também é acompanhado pelos arquivos de soma de verificação SHA1 e MD5:
O objetivo dessas somas de verificação é garantir a integridade dos artefatos associados. Comonetworks and file systems can fail, como qualquer outra coisa, há momentos em que os artefatos são corrompidos, fazendo com que o conteúdo do artefato não corresponda à assinatura.
Nessas situações, o Maven cria um erro de "cabeçalho LOC inválido".
The solution is to remove the corrupt jar from the repository. Vamos ver algumas maneiras.
3. Excluir o repositório local
Uma solução rápida para o erro édelete the whole Maven local repository and build the project again:
rm -rf ${LOCAL_REPOSITORY}
Isso apagará o cache local e baixará novamente todas as dependências do projeto -not very efficient.
Observe que o repositório local padrão está em$\{user.home}/.m2/repository, a menos que o tenhamos especificado em nossa tagsettings.xml <localRepository>. Também podemos encontrar o repositório local pelo comando:mvn help:evaluate -Dexpression=settings.localRepository
4. Encontre o frasco corrompido
Outra solução éidentify the specific corrupt jar and delete it from the local repository.
Quando usamos o comando de rastreamento de pilha de saída do Maven, ele contém os detalhes do jar corrompido quando falha em processá-lo.
Podemos ativar o log no nível de depuração adicionando -X ao comando build:
mvn -X package
O rastreamento de pilha resultante indicará o jar corrompido no final do log. Após identificar o jar corrompido, podemos localizá-lo no repositório local e excluí-lo. Agora, após a compilação, o Maven tentará novamente o download do jar.
Além disso, podemos testar a integridade do arquivo com o comandozip -T:
find ${LOCAL_REPOSITORY} -name "*.jar" | xargs -L 1 zip -T | grep error
5. Validar somas de verificação
As duas soluções mencionadas anteriormente forçarão o Maven a baixar novamente novamente o jar. Obviamente, o problema pode ocorrer novamente em downloads futuros. We can prevent that by configuring Maven to validate the checksum while downloading the artifact from a remote repository.
Podemos adicionar a opção–strict-checksums or -C ao comando Maven. Isso fará com que o Maven falhe na compilação se a soma de verificação calculada não corresponder ao valor nos arquivos de soma de verificação.
Existem duas opções, parafail a compilação se as somas de verificação não corresponderem:
-C,--strict-checksums
ouwarn que é a opção padrão:
-c,--lax-checksums
Hoje, o Maven requersignature files ao enviar artefatos para o repositório central. Masthere might be artifacts in the central repository that don’t have the signature files, principalmente os históricos. É por isso que a opção padrão éwarn.
Para uma solução mais permanente, podemos configurarchecksumPolicy no arquivosettings.xml do Maven. Esta propriedade especifica o comportamento quando a verificação de uma soma de verificação de artefato falha. Para evitar problemas no futuro, vamos editar nosso arquivosettings.xml para falhar no download quando a soma de verificação falhar:
codehausSnapshots
Codehaus Snapshots
false
always
fail
Claro, precisaríamos fazer isso para cada um de nossos repositórios configurados.
6. Conclusão
Nesta rápida descrição, vimos quando pode ocorrer um erro inválido no cabeçalho do LOC e opções de como lidar com isso.