如何在非 Tycho 项目中使用 pomless tycho 工件

Posted

技术标签:

【中文标题】如何在非 Tycho 项目中使用 pomless tycho 工件【英文标题】:How to use pomless tycho artifacts in non-tycho project 【发布时间】:2022-01-06 10:17:46 【问题描述】:

我有两个项目:

    一个使用 pomless Tycho 方法构建的 Eclipse 项目 使用纯 Maven、无 OSGI、无 Tycho 构建的纯 Java 项目

我需要在第二个项目中使用来自第一个项目的一些捆绑包。我尝试使用mvn clean install 将第一个项目中的 jar 文件安装到本地 maven 存储库中。并试图从第二个项目中引用它们。但我收到以下错误:

无法在项目上执行目标...:无法解析项目的依赖项...:无法在 bpms:bpms.util.jdk:jar:0.1.0-SNAPSHOT 收集依赖项:无法读取工件描述符bpms:bpms.util.jdk:jar:0.1.0-SNAPSHOT: 找不到 bpms:bundles:pom:1.0.0-SNAPSHOT in https://repo.maven.apache.org/maven2 已缓存在本地存储库中,直到更新后才会重新尝试解析中心间隔已过或强制更新 -> [帮助 1]

bpms.util.jdk-0.1.0-SNAPSHOT.pom 文件包含以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>bpms</groupId>
    <artifactId>bundles</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <relativePath>..\.polyglot.pom.tycho</relativePath>
  </parent>
  <artifactId>bpms.util.jdk</artifactId>
  <version>0.1.0-SNAPSHOT</version>
  <packaging>eclipse-plugin</packaging>
  <name>jdk utils</name>
</project>

问题似乎是由父工件引起的。是否可以在不参考父 bundles 的情况下将我的工件安装为独立工件?

什么是正确的方法?我不能使用无 pomless Tycho,应该为每个包定义一个单独的 pom.xml?

【问题讨论】:

我怀疑它会以这种方式工作(因为 Maven 存储库与 p2 存储库不同)。请链接到这样说的文档。 Tycho 在/p2/osgi/bundle/ 的 Maven 存储库中存储/缓存捆绑 JAR。在您的第二个项目中,您是否尝试过通过 &lt;systemPath&gt;$settings.localRepository/p2/osgi/bundle/&lt;path-to-the-jar&gt;.jar&lt;/systemPath&gt; 引用 JAR? 不,我使用 mvn clean install 将捆绑包安装到 ~/.m2 文件夹中,并像往常一样引用它们 maven &lt;dependency&gt;。文件夹 ~/.p2 或类似文件夹不包含我的包。 似乎最简单的方法是使用mvn install:install-file安装所有jar文件。并且不要使用mvn clean install 这不是我说的,也不是我问的。我猜你的假设是错误的,即在 Tycho 构建中 mvn clean installmvn clean verify 做得更多。据我所知,p2 捆绑包工件存储/缓存在~/.m2/repository/p2/osgi/bundle/ 中。如果mvn install:install-file 有效,请将其添加为自我回答。 【参考方案1】:

似乎最简单的方法是使用mvn install:install-file 安装jar 文件。这是一个可能对某人有用的 bat 文件:

@echo off

set MVN_HOME=C:/Tools/apache-maven-3.6.3
set BUNDLES_HOME=C:/Work/workspace-bpms-trunk/bundles
set ECLIPSE_HOME=C:/Tools/eclipse/plugins

set PATH=%MVN_HOME%/bin;%PATH%

for /f "tokens=1,2 delims=:" %%E in (deps.txt) do (
  if exist %BUNDLES_HOME%/%%F (
    for /f "tokens=1,2 delims=: " %%G in (%BUNDLES_HOME%/%%F/META-INF/MANIFEST.MF) do (
      if "%%G" == "Bundle-Version" (
        call mvn install:install-file -DgroupId=%%E -DartifactId=%%F -Dversion=%%~nH-SNAPSHOT -DgeneratePom=true -Dpackaging=jar -Dfile="%BUNDLES_HOME%/%%F/target/%%F-%%~nH-SNAPSHOT.jar"
      )
    )
  ) else (
    for %%G in (%ECLIPSE_HOME%/%%F_*.jar) do (
      for /f "tokens=2 delims=_" %%H in ("%%~nG") do (
        call mvn install:install-file -DgroupId=%%E -DartifactId=%%F -Dversion=%%H -DgeneratePom=true -Dpackaging=jar -Dfile="%ECLIPSE_HOME%/%%~nG.jar"
      )
    )
  )
)

它从deps.txt文件中读取groupIdartifactId,格式如下:

org.eclipse.ocl:org.eclipse.ocl
org.eclipse.ocl:org.eclipse.ocl.common
org.eclipse.ocl:org.eclipse.ocl.ecore
org.eclipse.ocl:org.eclipse.ocl.pivot

首先它试图在BUNDLES_HOME 中找到一个包。如果找到,那么它会从 META-INF/MANIFEST.MF 读取捆绑版本并将 jar 安装到本地 maven 存储库中。生成 pom 文件。

如果在 BUNDLES_HOME 中找不到捆绑包,那么它会尝试在 ECLIPSE_HOME 中找到它。

第二个脚本读取deps.txt 并生成pom.xml 的依赖项列表:

@echo off

set BUNDLES_HOME=C:/Work/workspace-bpms-trunk/bundles
set ECLIPSE_HOME=C:/Tools/eclipse/plugins

break > deps-gen.txt

for /f "tokens=1,2 delims=:" %%E in (deps.txt) do (
  if exist %BUNDLES_HOME%/%%F (
    for /f "tokens=1,2 delims=: " %%G in (%BUNDLES_HOME%/%%F/META-INF/MANIFEST.MF) do (
      if "%%G" == "Bundle-Version" (
        echo        ^<dependency^>>> deps-gen.txt
        echo            ^<groupId^>%%E^</groupId^>>> deps-gen.txt
        echo            ^<artifactId^>%%F^</artifactId^>>> deps-gen.txt
        echo            ^<version^>%%~nH-SNAPSHOT^</version^>>> deps-gen.txt
        echo        ^</dependency^>>> deps-gen.txt
      )
    )
  ) else (
    for %%G in (%ECLIPSE_HOME%/%%F_*.jar) do (
      for /f "tokens=2 delims=_" %%H in ("%%~nG") do (
        echo        ^<dependency^>>> deps-gen.txt
        echo            ^<groupId^>%%E^</groupId^>>> deps-gen.txt
        echo            ^<artifactId^>%%F^</artifactId^>>> deps-gen.txt
        echo            ^<version^>%%H^</version^>>> deps-gen.txt
        echo        ^</dependency^>>> deps-gen.txt
      )
    )
  )
)

类似的 Linux 安装程序:

#!/bin/bash

BUNDLES_HOME=~/workspaces/workspace-bpms-trunk/bundles
ECLIPSE_PLUGINS=~/.p2/pool/plugins

while IFS=":" read -r group artifact || [ -n "$p" ]; do
  artifact="$artifact//[$'\r\n']"
  if [ "$artifact" = "" ]; then
    :
  elif [ -d "$BUNDLES_HOME/$artifact" ]; then
    while IFS=":" read -r key value || [ -n "$p" ]; do
      if [ "$key" = "Bundle-Version" ]; then
        version="$value//[[:space:]]/"
        version="$version/.qualifier/-SNAPSHOT"
        mvn install:install-file -DgroupId=$group -DartifactId=$artifact \
          -Dversion=$version -DgeneratePom=true -Dpackaging=jar \
          -Dfile="$BUNDLES_HOME/$artifact/target/$artifact-$version.jar"
      fi
    done < "$BUNDLES_HOME/$artifact/META-INF/MANIFEST.MF"
  else
    for file in "$ECLIPSE_PLUGINS"/$artifact_*.jar; do
      version="$file%%.jar"
      version="$version##*_"
      mvn install:install-file -DgroupId=$group -DartifactId=$artifact \
        -Dversion=$version -DgeneratePom=true -Dpackaging=jar -Dfile="$file"
    done
  fi
done < deps.txt

和 pom-file 依赖生成器:

#!/bin/bash

BUNDLES_HOME=~/workspaces/workspace-bpms-trunk/bundles
ECLIPSE_PLUGINS=~/.p2/pool/plugins

: > deps-gen.txt

while IFS=":" read -r group artifact || [ -n "$p" ]; do
  artifact="$artifact//[$'\r\n']"
  if [ "$artifact" = "" ]; then
    echo >> deps-gen.txt
  elif [ -d "$BUNDLES_HOME/$artifact" ]; then
    while IFS=":" read -r key value || [ -n "$p" ]; do
      if [ "$key" = "Bundle-Version" ]; then
        version="$value//[[:space:]]/"
        version="$version/.qualifier/-SNAPSHOT"
        echo "        <dependency>" >> deps-gen.txt
        echo "            <groupId>$group</groupId>" >> deps-gen.txt
        echo "            <artifactId>$artifact</artifactId>" >> deps-gen.txt
        echo "            <version>$version</version>" >> deps-gen.txt
        echo "        </dependency>" >> deps-gen.txt
      fi
    done < "$BUNDLES_HOME/$artifact/META-INF/MANIFEST.MF"
  else
    for file in "$ECLIPSE_PLUGINS"/$artifact_*.jar; do
      version="$file%%.jar"
      version="$version##*_"
      echo "        <dependency>" >> deps-gen.txt
      echo "            <groupId>$group</groupId>" >> deps-gen.txt
      echo "            <artifactId>$artifact</artifactId>" >> deps-gen.txt
      echo "            <version>$version</version>" >> deps-gen.txt
      echo "        </dependency>" >> deps-gen.txt
    done
  fi
done < deps.txt

【讨论】:

以上是关于如何在非 Tycho 项目中使用 pomless tycho 工件的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Tycho 和 Java 9 构建 Eclipse RCP 项目

不可解析的构建扩展:插件org.eclipse.tycho:tycho-maven

如何使用 eclipse-plugin 打包将 Mockito 添加到 Tycho 的单元测试中的测试类路径

如何用maven tycho构建自己的Eclipse RCP应用

使用 tycho-surefire-plugin 运行单个插件测试方法

Tycho 的 Maven 多模块中的自定义 pom.xml 文件名