当前位置:Java -> 连接 JavaScript 和 Java 包:介绍 Npm2Mvn

连接 JavaScript 和 Java 包:介绍 Npm2Mvn

在企业应用程序开发中,将来自不同平台和生态系统的资产整合起来是一个重大挑战,因为项目通常涉及多种技术和语言。无缝地整合基于 web 的资产,如 JavaScript、CSS 和其他资源,是 Java web 应用程序中常见但复杂的需求。

开发生态系统的多样性——每个生态系统都有其自己的工具、程序包管理器和分发方法——使得在统一的开发工作流程中包含这些资产变得更加复杂。这种分散会导致效率低下、开发时间增加,并且在开发人员处理集成不同系统的复杂性时可能出现错误。

为了解决这一挑战,开源项目Npm2Mvn 提供了一个解决方案,用于简化将 NPM packages 加入到 Java 工作空间中,从而弥合 JavaScript 和 Java 生态系统之间的差距。

理解 NPM 和 Maven

在深入研究Npm2Mvn 的复杂性之前,理解其连接的平台:NPM 和 Maven 是至关重要的。

NPM(Node Package Manager)是 Node.js的默认程序包管理器,主要用于管理各种 JavaScript 项目的依赖关系。它托管了全球开发人员提供的数千个程序包,促进了代码的共享和分发。NPM 简化了在项目中添加、更新和管理库和工具,使其成为 JavaScript 开发人员不可或缺的工具。

Maven,另一方面,是一个强大的构建自动化工具,主要用于 Java 项目。它不仅仅用于简单的构建任务,还通过管理项目依赖关系、文档、SCM(源代码管理)和发布来扩展了功能。Maven 利用项目对象模型(POM)文件来管理项目的构建配置、依赖关系和其他元素,从而确保开发人员可以轻松管理和构建他们的 Java 应用程序。

Npm2Mvn 的起源

Npm2Mvn 作为开发人员面临的一个熟悉挑战的解决方案:将 NPM 上可用的大量 JavaScript 库和框架整合到 Java 项目中。尽管 Java 和 JavaScript 在不同的环境中运行,但需要在 Java 应用程序中使用 Web 资产(如 CSS、JavaScript 文件和字体)的需求呈指数增长。这对于需要丰富客户端界面或在服务器端渲染前端组件的项目尤其相关。

许多 JavaScript 项目专门通过 NPM 分发,因此,如果您像我一样,发现自己需要将 NPM 存档中的资产复制粘贴到 Java web 应用程序工作空间中,那么Npm2Mvn 就是您需要的解决方案。

Npm2Mvn 的关键功能

 设计用于自动将 NPM 包转换为 Maven 兼容的 jar 文件,Npm2Mvn 使得 NPM packages 可轻松被 Java 开发人员使用。这个过程涉及几个关键步骤:

  1. 标准的 Maven 仓库布局:通过使用另一个开源项目 uHTTPD,NPM2MVN 呈现为标准的 Maven 仓库。
  2. 自动包转换:当接收到对 npm 组中 Maven artifact 的请求时,NPM2MVN 会从 NPM 获取包元数据和 tarball。然后它会为 Maven 增添额外的元数据,比如 POM 文件和 MANIFEST.MF。
  3. 包括额外的元数据:除了标准的 Maven 元数据之外,NPM2MVN 还为 Graal 本机映像添加了特定的元数据,增强了支持 GraalVM 的项目的兼容性和性能。
  4. 无缝集成到本地 Maven 缓存中:最终的 jar 文件,包含必要的元数据,被放置在本地 Maven 缓存中,就像任何其他构件一样,确保在 Java 项目中使用 NPM packages 就像添加 Maven 依赖一样简单。

Java 开发人员的好处

Npm2Mvn 为 Java 开发人员带来了几个引人注目的好处:

  • 访问大量的 JavaScript 库:通过将 NPM 和 Maven 进行桥接,Java 开发人员可以轻松地将数千个 JavaScript 库和框架整合到他们的项目中。这种访问显著扩展了增强 Java 应用程序的资源,特别是对于 UI/UX 设计,而不离开熟悉的 Maven 生态系统。
  • 简化的依赖管理:跨不同生态系统管理依赖关系可能很麻烦。 Npm2Mvn 简化了这个过程,使开发人员可以用他们熟悉的 Maven 命令处理 NPM 包。
  • 提升了生产力:通过自动将 NPM packages 转换为 Maven 构件,NPM2MVN 省去了开发人员大量的时间和精力。这种效率提升使得开发人员可以更多地专注于构建他们的应用程序,而不是与包管理的复杂性作斗争。
  • 实际应用:像 Fontawesome、Xterm 和 Bootstrap 这样的项目,作为前端开发的基础,可以无缝地集成到 Java 应用程序中。

如何使用

使用Npm2Mvn非常简单。项目的开发人员Jadaptive托管了一个仓库,这里。该仓库开放并免费使用。您还可以下载一个服务器副本,以在私有构建环境中托管。

要使用此服务,请将仓库条目添加到您的POM文件中。

<repositories>
   <repository>
      <id>npm2mvn</id>
      <url>https://npm2mvn.jadaptive.com</url>
   </repository>
</repositories>


现在,声明您的NPM包。例如,在这里我包含了JQuery NPM包。

<dependency> 
     <groupId>npm</groupId>
     <artifactId>jquery</artifactId>
     <version>3.7.1</version>
 </dependency>


这就是我们需要包含NPM包并进行版本管理到类路径中的所有内容。

在您的Java应用程序中使用NPM资源

NPM包的资源被放置在jar包中的固定前缀下,通过类路径或模块路径,允许多个版本的多个NPM包对JVM可用。

例如,如果NPM包bootstrap@v5.3.1包含路径为css/bootstrap.css的资源,则Npm2Mvn包将使该资源在资源路径/npm2mvn/npm/bootstrap/5.3.1/css/boostrap.css下可用。

现在您知道类路径中资源的路径,可以准备在您的Java Web应用程序中使用Servlet或其他机制来提供类路径中的资源。您可以根据您使用的Web应用程序平台和任何框架来完成这一步骤。在Spring Boot中,我们将添加一个资源处理程序如下所示。

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
          .addResourceHandler("/npm2mvn/**")
          .addResourceLocations("classpath:/npm2mvn/");    
    }
}


通过在Spring Boot应用程序中配置这项,我们现在可以直接引用应用程序中使用的HTML文件中的NPM资源。

<script type="text/javascript" src="/npm2mvn/npm/jquery/3.7.1/dist/jquery.min.js">


那NPM作用域呢?

NPM版本2支持作用域,根据他们的网站:

... 让您能够创建一个与其他用户或组织创建的包同名的包,而不会发生冲突。

在上面的例子中,我们没有使用作用域。如果您需要的包使用了作用域,则必须修改您的pom.xml 依赖项和资源路径。

FontAwesome项目为例,要将@fortawesome/fontawesome-free模块包含到我们的Maven构建中,我们修改groupId以包含作用域,如下所示。

<dependency> 
     <groupId>npm.fortawesome</groupId>
     <artifactId>fontawesome-free</artifactId>
     <version>6.5.1</version>
 </dependency>


同样,在资源路径中,我们将第二个路径值从'npm'改为与上面使用的groupId相同的值。

<link rel="stylesheet" href="/npm2nvm/npm.fortawesome/fontawesome-free/6.5.1/css/all.css"/>


您可以下载一个完整的Spring Boot示例,该示例集成了Xterm NPM模块和来自GitHub的附加组件。

依赖生成器

托管在Npm2Mvn托管版本的网站提供了一个有用的工具,开发人员可以使用该工具获取构建所需依赖项的正确语法。

在这里,我们输入了作用域、包和版本,以获取用于Maven构建的正确依赖项条目。如果项目没有作用域,则将第一个字段留空。

结论

Npm2Mvn连接了JavaScript和Java世界,增强了开发人员的能力和项目可能性。通过简化将NPM包集成到Java工作空间中,Npm2Mvn促进了更加互联和高效的开发环境。它让开发人员能够在其应用程序中充分利用这两个生态系统的优势。

推荐阅读: 百度面经(18)

本文链接: 连接 JavaScript 和 Java 包:介绍 Npm2Mvn