使用Maven进行图书馆开发

时间:2010-10-01 02:29:15

标签: java maven-2 build-process

这可能更像是一个过程,然后是技术解决方案。我目前正在开发一个分为库和实现应用程序的项目。在构建应用程序时,这样做是调试库的一种非常有效的方法。我想在两个项目中使用Maven,但我不想为每个小的更改进行构建和部署。有没有办法让Maven几乎将项目作为存储库引用?

3 个答案:

答案 0 :(得分:2)

你是对的,这是一个过程问题。我将您的问题解释为希望避免将库的特定版本声明为实现中的依赖项。目的是独立更新任一组件,特别是您希望能够更新库而无需重建实现。

如果进行更改,您显然需要重建和重新部署某些内容。但是,我可以看到两个应该解决您问题的步骤。我要打电话给你的组件'lib'和'app'。

  1. 在lib和app上创建一个空的“包装器”项目,依赖(scope = runtime)。这个包装器是你要部署的。更新lib或app时,只需要在包装器项目中更新该依赖项的版本。当您“构建”(编译是无操作)并测试包装器项目时,您将确认旧/新应用程序仍然可以使用新/旧库,并且您可以部署更新。当然,如果您的测试失败,您将需要更新应用程序的lib依赖项,以查看重建是否解决了问题,并尝试查找哪个组件存在错误。因此,在我看来,这只是一个解决方案。
  2. 更好的是创建一个'lib-api'组件,它声明了lib和app之间的接口。使lib和app都依赖于lib-api,但应用程序依赖于特定版本的lib。您可能仍然需要如上所述的包装器项目,以便于部署(因为您需要实际部署lib和app)。但只要您不需要影响库API,您就可以确信您对lib或app的更改是相互保护的,并且不会(不能)需要重建。这可能会更容易追踪任何错误。如果你需要更新lib-api,你显然需要重建所有东西,但无论如何都是如此,至少这种方式暴露在项目结构中。
  3. 希望这对你有意义,我正确地解释了你的问题。

答案 1 :(得分:1)

你可以有一个“超级pom”,它有两个子项目。一个项目是您的库,另一个项目是您的应用程序。两者都可以单独开发。

您的应用程序将依赖于库中的项目。

例如:

“super-pom”:将此pom.xml存储在较高的目录中。你会有这样的东西:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>your.group</groupId>
    <artifactId>project</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>caap</name>
    <modules>
        <module>project-library</module>
        <module>project-app</module>
    </modules>
</project>

然后你的库pom.xml会有这样的东西:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://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>
        <artifactId>project</artifactId>
        <groupId>your.group</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>=your.group</groupId>
    <artifactId>project-library</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>project-library</name>
</project>

你的应用程序会有这样的东西:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://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>
        <artifactId>project</artifactId>
        <groupId>your.group</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>=your.group</groupId>
    <artifactId>project-application</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>project-application</name>
      <dependencies>
               <dependency>
           <artifactId>project-library</artifactId>
           <groupId>your.group</groupId>
                   <version>1.0-SNAPSHOT</version>
               </dependency>
      </dependencies>            
</project>

答案 2 :(得分:0)

mvn install

看起来像我想要的。只需从项目运行它就会将其添加到本地仓库,其他应用程序可以将其提取。