【问题标题】:Tycho can't resolve javax.rmi after switching to Java-11Tycho 切换到 Java-11 后无法解析 javax.rmi
【发布时间】:2020-08-04 08:39:29
【问题描述】:

我正在尝试将我们遗留的多模块项目切换到 Java-11,但第谷抱怨缺少依赖项 在我的 pom 文件中,我将 JDK 版本添加为 11。这是 pom 的一部分

...
 <properties>
    
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <jdk-version>11</jdk-version>
    <!-- Plugins tycho version -->
    <tycho.version>1.7.0</tycho.version>
...
 </properties>
<build>
...
<plugin>
        <groupId>org.eclipse.tycho</groupId>
        <artifactId>tycho-compiler-plugin</artifactId>
        <version>${tycho.version}</version>
        <configuration>
          <source>${jdk-version}</source>
          <target>${jdk-version}</target>
        </configuration>
      </plugin>
...
</build>

这是我的 META-INF/MANIFEST.MF 文件

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Meta-Persistence: META-INF/openjpa_persistence_product.xml
Bundle-Name: JPA
Bundle-SymbolicName: com.XXX.jpa
Bundle-Version: 2.1.2
Bundle-Vendor: XXX
Bundle-RequiredExecutionEnvironment: JavaSE-11
Eclipse-ExtensibleAPI: true
Import-Package: com.XXX.config,
 com.XXX.core,
 com.XXX.core.util.logging,
 com.XXX.sql,
 javax.persistence,
 javax.persistence.criteria,
 javax.persistence.metamodel,
 org.apache.openjpa.persistence,
 org.apache.openjpa.util,
 org.osgi.framework,
 org.osgi.service.component,
 org.osgi.service.jdbc,
 org.osgi.service.jndi,
 org.osgi.service.jpa,
 org.slf4j
Export-Package: com.XXX.jpa,
 com.XXX.jpa.concurrent,
 com.XXX.jpa.util
Service-Component: OSGI-INF/*.xml
Bundle-ActivationPolicy: lazy

执行 mvn clean install 后我收到了

ERROR] Cannot resolve project dependencies:
[ERROR]   Software being installed: com.XXX.jpa 2.1.2
[ERROR]   Missing requirement: org.apache.openjpa 3.0.0 requires 'java.package; javax.rmi 0.0.0' but it could not be found
[ERROR]   Cannot satisfy dependency: com.XXX.jpa 2.1.2 depends on: java.package; org.apache.openjpa.persistence 0.0.0

我尝试了什么

  1. 在 MANIFEST.MF 中为 org.apache.openjpa.persistence、org.apache.openjpa.util 添加版本
  2. 将 javax.rmi 添加到 MANIFEST.MF 的 Import-Package 部分

但结果总是一样 - 对 javax.rmi 包的第谷投诉

更新 嗨@howlger!感谢您的帮助,但现在我收到了另一个问题

  1. 我为 javax.rmi 创建了 bunlde
  <parent>
    <groupId>com.XXX</groupId>
    <artifactId>bundle.platform</artifactId>
    <version>2.1.2</version>
    <relativePath>../pom.xml</relativePath>
  </parent>
  
  <!-- This bundle was added because in Java-11 javax.rmi package was removed from the standard library -->
  <groupId>com.XXX</groupId>
  <artifactId>com.XXX.javax.rmi</artifactId>
  <version>1.0.6.Final</version>
  <packaging>bundle</packaging>
  <name>Java RMI API Bundle</name>
  
  <dependencies>
    <dependency>
      <groupId>org.jboss.spec.javax.rmi</groupId>
      <artifactId>jboss-rmi-api_1.0_spec</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <extensions>true</extensions>
        <configuration>
          <instructions>
            <Export-Package>
              *;version="${project.version}"
            </Export-Package>
            <Import-Package>
              *
            </Import-Package>
            <Embed-Dependency>*;scope=compile|runtime;inline=true</Embed-Dependency>
            <Bundle-SymbolicName>
              ${project.artifactId}
            </Bundle-SymbolicName>
          </instructions>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-deploy-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

并部署到我们的工件中,但遗憾的是无法将此捆绑包添加到 p2 功能

我将它作为依赖项添加到主 pom 文件中,该文件创建 p2 repo 为

 <dependencies>
 <!-- com.XXX.javax.rmi -->
    <dependency>
      <groupId>org.jboss.spec.javax.rmi</groupId>
      <artifactId>jboss-rmi-api_1.0_spec</artifactId>
      <version>${javax.rmi.version}</version>
    </dependency>    
    <dependency>
      <groupId>org.jboss.spec.javax.rmi</groupId>
      <artifactId>jboss-rmi-api_1.0_spec</artifactId>
      <version>${javax.rmi.version}</version>
      <classifier>sources</classifier>
    </dependency>
 </dependencies> 

但是当我尝试将该捆绑包作为插件添加到平台功能时

<plugin
        id="com.XXX.javax.rmi"
        download-size="0"
        install-size="0"
        version="0.0.0"
        unpack="false"/>

我收到了:

[ERROR] Cannot resolve project dependencies:
[ERROR]   Software being installed: com.XXX.repository 2.1.2
[ERROR]   Missing requirement: com.XXX.bundle.platform.feature.feature.group 2.1.2 requires 'org.eclipse.equinox.p2.iu; com.navteq.javax.rmi 0.0.0' but it could not be found
[ERROR]   Cannot satisfy dependency: com.navteq.phoenix.repository 2.1.2 depends on: org.eclipse.equinox.p2.iu; com.navteq.phoenix.bundle.platform.feature.feature.group [2.1.2,2.1.3)
[ERROR]

我做错了什么?

更新2 这个问题有两个主要问题

  1. 创建 p2 存储库的主 pom 文件中的依赖项不正确 - 它应该具有与创建 bandle 的 pom 中相同的 groupId、artifactId、版本
<dependencies>
 <!-- com.XXX.javax.rmi -->
    <dependency>
      <groupId>com.XXX</groupId>
      <artifactId>com.XXX.javax.rmi</artifactId>
      <version>1.0.6.Final</version>
    </dependency>
 </dependencies>
  1. 应将 sun.refelection 的导入添加到创建 bundle 的 pom 文件中
<configuration>
  <instructions>
    <Export-Package>
      *;version="${project.version}"
    </Export-Package>
    <Import-Package>
      sun.reflect;resolution:=optional
    </Import-Package>
    <Embed-Dependency>*;scope=compile|runtime;inline=true</Embed-Dependency>
    <Bundle-SymbolicName>
      ${project.artifactId}
    </Bundle-SymbolicName>
  </instructions>
</configuration>

【问题讨论】:

    标签: eclipse java-11 tycho


    【解决方案1】:

    javax.rmi 包包含在系统库中(在 Java 9 和 10 中的模块 java.corba直到它在 Java 中被删除11JEP 320

    对于 Java 11 或更高版本,您需要添加一个插件/包,其中包含包 javax.rmi到您的目标平台,因为 org.apache.openjpa 插件需要它/捆绑你有。或者可能有更新版本的 org.apache.openjpa 包含 javax.rmi 包或不再需要它。

    【讨论】:

    • 嗨@howlger,你能看看我帖子中的更新吗?
    • 作为 Maven 工件或 Eclipse p2 安装单元部署到您的 Artifactory?请同时显示您的target definition file。恕我直言,而不是更新,您应该使用 [artifactory] ​​标签将其作为一个单独的问题提出(我没有使用 Artifactory 的经验)。
    • 你从哪里得到捆绑包?
    • @Mr.Mundkowsky 我在 2021-09 版本和 Orbit 中都没有看到它,只有 non-OSGi bundle。如果没有人提供,您将不得不自己构建它。
    猜你喜欢
    • 2014-03-09
    • 1970-01-01
    • 2019-04-07
    • 2021-09-25
    • 1970-01-01
    • 2020-04-21
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多