Usar o maven tycho para construir com um manifesto de entrada Bundle-ClassPath que é baixado pelo maven dependency-plugin
Pergunta
Eu tenho um plugin do eclipse com este manifesto:
...
Bundle-ClassPath: .,
lib/drools-api.jar,
lib/drools-core.jar,
...
Agora nós não queremos colocar drools-api.jar
e drools-core.jar
no controle de origem, então vamos usar um plugin para buscá-los a partir do repositório maven:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-bundle-classpath-libs</id>
<phase>validate</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>lib</outputDirectory>
<overWriteReleases>true</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<stripVersion>true</stripVersion>
<artifactItems>
<artifactItem>
<groupId>org.drools</groupId>
<artifactId>drools-api</artifactId>
</artifactItem>
<artifactItem>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
</artifactItem>
...
No entanto, a primeira vez vamos construir este módulo, ele não consegue, porque isso acontece:
[WARNING] Missing classpath entry lib/drools-api.jar ...
[WARNING] Missing classpath entry lib/drools-core.jar ...
...
[INFO] --- maven-dependency-plugin:2.1:copy (copy-bundle-classpath-libs) ... ---
...
[INFO] Copying drools-api-5.2.0-SNAPSHOT.jar to .../lib/drools-api.jar
[INFO] Copying drools-core-5.2.0-SNAPSHOT.jar to .../lib/drools-core.jar
...
[INFO] --- maven-osgi-compiler-plugin:0.10.0:compile (default-compile) ... ---
...
[INFO] Compiling 458 source files to ...
// ERROR because drools-api is not in the compilation classpath
Se nós apenas construí-lo novamente, ele consegue, porque os vidrinhos já estão no lib
diretório antes de a cria começa:não há advertências e os frascos são na compilação classpath.
Como podemos corrigir isso assim não precisamos cometer os vidros no controle de origem e ainda usar Bundle-ClassPath
?
Nota:a implementação atual do plugin exige de nós o uso Bundle-ClassPath
:usando Require-Bundle
em vez disso, não é uma opção.
Solução
isso é um bug conhecido.
Outras dicas
Eu tentei fazer semelhante coisa, e eu tenho a impressão de que isso não vai funcionar.
Parece maven dependency-plugin requer compilar classpath para ser resolvido em ordem para baixar Frascos (mesmo quando você especificar dependências através <artifactItems>).
Como resultado, Tycho-driven classpath resolução é executado antes de Frascos são baixados, então eles não fazem o seu caminho para o classpath.Tipo do ovo e da galinha problema.
Para resolver esse problema, eu criei um perfil separado "download-deps" que eu usei para atualizar as bibliotecas de diretório (como: mvn -Pdownload-deps validate
).
Este approcha não funciona bem, pois se há bundle B
que pacote de importação fornecido pelo pacote A
, que por sua vez incorpora Frascos que contém o pacote de compilação de B irá falhar com dependência não resolvidos.Portanto, você tem que executar esse comando até que todos os Frascos são baixados.Muito feio.