当前位置: 首页 > 知识库问答 >
问题:

从给定的pom.xml文件中提取类路径的简单java代码?

姬振
2023-03-14

如何编写一个简单的java main():

  1. 将maven作用域名和pom.xml文件路径作为参数
  2. 生成包含相应maven项目和作用域的类路径的字符串列表
  3. 仅依赖于当前正在维护的库?

动机:

    Unable to parse POM file: org.codehaus.plexus.component.repository.exception.ComponentLookupException: com.google.inject.ProvisionException: Guice provision errors:

    1) No implementation for java.util.Set<org.eclipse.aether.RepositoryListener> was bound.
      while locating java.util.Set<org.eclipse.aether.RepositoryListener>
        for parameter 0 at org.eclipse.aether.internal.impl.DefaultRepositoryEventDispatcher.<init>(Unknown Source)
      while locating org.eclipse.aether.internal.impl.DefaultRepositoryEventDispatcher
      at ClassRealm[maven, parent: ClassRealm[maven-parent, parent: null]]
      at ClassRealm[maven, parent: ClassRealm[maven-parent, parent: null]]
      while locating org.eclipse.aether.impl.RepositoryEventDispatcher
        for parameter 0 at org.eclipse.aether.internal.impl.DefaultMetadataResolver.<init>(Unknown Source)
      while locating org.eclipse.aether.internal.impl.DefaultMetadataResolver
      at ClassRealm[maven, parent: ClassRealm[maven-parent, parent: null]]
      at ClassRealm[maven, parent: ClassRealm[maven-parent, parent: null]]
      while locating org.eclipse.aether.impl.MetadataResolver
        for parameter 0 at org.apache.maven.repository.internal.DefaultVersionResolver.<init>(Unknown Source)
      while locating org.apache.maven.repository.internal.DefaultVersionResolver
      at ClassRealm[maven, parent: ClassRealm[maven-parent, parent: null]]
      at ClassRealm[maven, parent: ClassRealm[maven-parent, parent: null]]
      while locating org.eclipse.aether.impl.VersionResolver
        for parameter 0 at org.eclipse.aether.internal.impl.DefaultRepositorySystem.<init>(Unknown Source)
      while locating org.eclipse.aether.internal.impl.DefaultRepositorySystem
      at ClassRealm[maven, parent: ClassRealm[maven-parent, parent: null]]
      at ClassRealm[maven, parent: ClassRealm[maven-parent, parent: null]]
      while locating org.eclipse.aether.RepositorySystem
      while locating org.apache.maven.artifact.resolver.DefaultArtifactResolver
      at ClassRealm[maven, parent: ClassRealm[maven-parent, parent: null]]
      at ClassRealm[maven, parent: ClassRealm[maven-parent, parent: null]]
      while locating org.apache.maven.artifact.resolver.ArtifactResolver
      while locating org.apache.maven.repository.legacy.LegacyRepositorySystem
      at ClassRealm[maven, parent: ClassRealm[maven-parent, parent: null]]
      at ClassRealm[maven, parent: ClassRealm[maven-parent, parent: null]]
      while locating org.apache.maven.repository.RepositorySystem
      while locating org.apache.maven.execution.DefaultMavenExecutionRequestPopulator
      at ClassRealm[maven, parent: ClassRealm[maven-parent, parent: null]]
      at ClassRealm[maven, parent: ClassRealm[maven-parent, parent: null]]
      while locating org.apache.maven.execution.MavenExecutionRequestPopulator

    2) No implementation for java.util.Set<org.eclipse.aether.RepositoryListener> was bound.
      while locating java.util.Set<org.eclipse.aether.RepositoryListener>
        for parameter 0 at org.eclipse.aether.internal.impl.DefaultRepositoryEventDispatcher.<init>(Unknown Source)
      while locating org.eclipse.aether.internal.impl.DefaultRepositoryEventDispatcher

    ...
    etc
    ...

      at ClassRealm[maven, parent: ClassRealm[maven-parent, parent: null]]
      at ClassRealm[maven, parent: ClassRealm[maven-parent, parent: null]]
      while locating org.apache.maven.execution.MavenExecutionRequestPopulator

    37 errors
        at com.google.inject.internal.InjectorImpl$3.get(InjectorImpl.java:974)
        at org.eclipse.sisu.inject.LazyBeanEntry.getValue(LazyBeanEntry.java:82)
        at org.eclipse.sisu.plexus.LazyPlexusBean.getValue(LazyPlexusBean.java:51)
        at org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:260)
        ... 37 more

对于只依赖于现代库的类路径派生的现有实现,比如https://github.com/apache/maven-dependency-plugin/tree/maven-dependency-plugin-3.1.1上,有没有一个简单的替代方案?

我特别要求提供main()方法的代码,以确保可以转换为插件代码,而不是假设我的代码是从一个已经计算类路径的正在运行的mvn进程调用的。

共有1个答案

狄灵均
2023-03-14

我在使用FitNesse maven插件时遇到了同样的问题,因此我放弃了修复该问题的尝试。相反,我使用了一些不同的方法来解决这个问题,也许这些方法也适用于你?

当从wiki运行测试时(例如,当我有一个本地FitNesse(web)服务器并且希望在浏览器中按“test”或“suite”):

  • 我按原样使用插件(将其放在wiki的插件文件夹中),没有问题;由于测试是在单独的JVM中运行的,它们有自己的类路径,与wiki的类路径(wiki有插件)分开,因此库的版本不会冲突。
  • 要创建一个本地wiki安装,而完全不需要Maven,我使用Maven的dependencies插件将fixtures所需的所有库复制到一个文件夹中,并使用FitNesse标准的!path符号将该目录中的所有JAR添加到类路径(例如!path fixtures/*.jar)

为了在构建服务器上运行测试,使用jUnit测试运行器,我使用Maven的failsafe插件来运行FitNesse测试,就好像它们是普通的jUnit测试一样。在我的FitNesse安装中,classpath插件是可用的(允许在本地运行wiki),所以我遇到了您描述的问题,因为使用相同的JVM解析wiki文件并运行测试:

  • 在此场景中,我禁用了FitNesse安装中的类路径插件(因为Maven Failsafe插件将确保所有依赖项都在JVM的类路径上,所以不需要再次解析pom.xml并将依赖项再次添加到类路径)。我通过将系统属性“Fitnesse.WikitExt.Widgets.MavenClasspathSymbolType.Disable”设置为“true”来实现这一点。我选择在Fitnesse的jUnit运行程序的自己的子类中(在Java代码中使用System.SetProperty(“fitnesse.wikitext.widgets.MavenClasspathSymboltype.disable”,“true”);)来完成此操作,但这也可以在pom.xml中配置,作为FailSafe配置的一部分。
 类似资料:
  • 问题内容: 我只想从完整路径到文件获取文件夹路径。 例如,我想要得到(不包括)。 我已经尝试过这样的事情: 但是它给了我这样的结果: 这不是我需要的结果(为)。 关于如何获取文件路径的任何想法? 问题答案: 您几乎可以使用该功能了。您只需要加入字符串,如下所示。 虽然,我建议使用该函数来执行此操作,但是您只需要传递字符串即可,它将为您完成工作。由于您似乎在Windows上,因此也考虑使用该功能。一

  • 我只想从文件的完整路径中获取文件夹路径。 例如,我希望只得到(不包括)。 我曾经尝试过这样的事情: 但它给了我这样一个结果: 这不是我需要的结果(是)。 关于如何获取文件路径有什么想法吗?

  • 问题内容: 我正在尝试读取在CLASSPATH系统变量中设置的文本文件。不是用户变量。 我正在尝试将输入流传输到文件,如下所示: 将文件()的目录放在CLASSPATH中,然后尝试以下操作: 将文件()的完整路径放在CLASSPATH中,然后尝试上述3行代码中的相同路径。 但是不幸的是,它们都没有起作用,我一直都在进入InputStream 。 问题答案: 在类路径上的目录中,从同一类加载器加载的

  • 我有一个名为images的文件夹,位于用户的文件夹中,如: 图像 用户1 当我从数据库中删除一个用户时,我还想删除该用户的所有文件和文件夹。所有这些都在一个包含函数的类中,但是当我执行函数时,我的整个文件夹图像都会被删除。。。 我已经检查了是否选择了正确的用户,路径是否正确。当我在测试的时候。php文件它工作得很好,但在我的函数中它被破坏了。 如果单击“删除”按钮,则转到此功能: 通过给定的id获

  • 我想在单击按钮时提取值。从和行和列中提取值。只是想要一个粗略的想法如何做提取和保存不同变量的值。我想在“保存”按钮下执行这些保存操作。

  • 我有一个带有图形编辑器的项目(如GMF技术),我需要读取一个文件。Jar库位于项目的类路径上。 VectorSync_1.0.0.201403121100.jar具有如下结构: 矢量同步: 图标/矢量同步。gif 这个导入的项目的类路径。Jar文件是: 我使用此方法尝试访问. xml文件: 但使用的方法始终返回null。 你能帮我解决这个问题吗 谢谢