精华内容
下载资源
问答
  • 在使用多模块开发时,通常一个模块(A)可能会需要其它模块(B)中的类或方法,这时就产生了依赖关系,也就是 A 依赖 B。 要解决上述依赖,有两种方案 1、将B发布到 repo 仓库(可以为本地仓库) 2、A直接依赖B ...

    问题背景

    在使用多模块开发时,通常一个模块(A)可能会需要其它模块(B)中的类或方法,这时就产生了依赖关系,也就是 A 依赖 B。

    要解决上述依赖,有两种方案

    • 1、将B发布到 repo 仓库(可以为本地仓库)
    • 2、A直接依赖B

    1、将 B 发布到仓库,修改 B 模块中的 build.gradle,增加

    apply plugin: 'maven'
    
    uploadArchives {
        repositories {
            mavenDeployer {
                repository(url: uri("../../repo"))
            }
        }
    }

    其中B模块具有如下配置:

    group 'com.test'
    version '0.0.1'

    这时在模块A中,就可以在 build.gradle 文件的 dependencies 节点,增加:

    compile 'com.test:b:0.0.1'

    2、A 直接依赖模块 B
    在 A 模块中的 build.gradle 的 dependencies 节点,增加:

    compile project(':b')
    展开全文
  • 现研发经理要求将所有工程进行整合和规范化,所以抽出一个parent父工程,base基础模块(包含一些公用的实体类和工具类等),以及其他子模块(Module A、 Module B ...)。Module A 以及Module B工程都需要依赖base工程。 ...

    场景:

    因为之前用到的是,基于springboot框架所搭建的maven工程,而且都是相互独立的。现研发经理要求将所有工程进行整合和规范化,所以抽出一个parent父工程,base基础模块(包含一些公用的实体类和工具类等),以及其他子模块(Module A、 Module B ...)。Module A 以及Module B工程都需要依赖base工程

    问题:

    在对Module A进行打包时,出现问题:Module A中所依赖的base工程的util程序包不存在。即使能打包成功,用java -jar启动jar包也会报Class Not Found,依赖的base工程的类找不到。

    解决方案:

    未解决之前在base工程的pom.xml中maven插件的配置如下:

        <build>  
            <plugins>  
                <plugin>  
                    <groupId>org.springframework.boot</groupId>  
                    <artifactId>spring-boot-maven-plugin</artifactId>  
                </plugin>  
            </plugins>  
        </build>  

    解决base工程的pom.xml的maven配置如下:

        <build>  
            <plugins>  
                <plugin>  
                    <groupId>org.springframework.boot</groupId>  
                    <artifactId>spring-boot-maven-plugin</artifactId>  
                    <configuration>  
                        <classifier>exec</classifier>  
                    </configuration>  
                </plugin>  
            </plugins>  
        </build>  

    原因分析:

    spring-boot-maven-plugin打包出来的jar是不可依赖的

     我们现在整合后的maven项目有一个parent工程,打包类型为pom,下面多个spring-boot工程作为它的module,分别为base和moduleA,moduleB。假如moduleA依赖于base。如果你在base中使用了spring-boot-maven-plugin的默认配置build,或者在parent工程中使用spring-boot-maven-plugin的默认配置build。那么在clean package的时候会发现moduleA找不到base中的类。原因就是默认打包出来的jar是不可依赖的。

    解决方案:

            官方告诉我们,你如果不想移代码,好吧,我这样来给你解决,给你打两个jar包,一个用来直接执行,一个用来依赖。于是,你需要指定一个属性classifier,这个属性为可执行jar包的名字后缀。比如我设置<classifier>exec</classifier>,原项目名为Vehicle-business。那么会得到两个jar:Vehicle-business.jar和Vehicle-bussiness-exec.jar

             官方文档位置:84.5 Use a Spring Boot application as a dependency

             总结:回到聚合maven上,如果你在parent工程中使用了spring-boot-maven-plugin作为builder,那么你的依赖module一定要用解决方案二来设置。否则你不在parent工程中用spring-boot-maven-plugin作为builder,而在需要打包的module上使用。

    一般parent工程的maven插件配置如下:

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                 <configuration>
              		<source>1.8</source>
              		<target>1.8</target>
            	</configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    被依赖的maven子模块的maven插件配置如下(其余maven子模块就不需要配置):

     <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

    其他的坑:

    1.jdk8一定要指明

             不指明的话在开发工具里运行没有一点问题,如果你没有用到java8的特性打包也没有问题。一旦你用到了java8的特性,而且使用spring-boot-maven-plugin作为builder,一定要指明jdk版本。不然你会收到类似不识别Lambda,请使用resource8这样的错误。

    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
      </properties>

    2.BOOT-INF陷阱

              这个问题就很恶心了。这个时候你已经打包成功,你会发现运行jar的时候报错为file not found,而且不告诉你是什么文件。你打开jar去看,发现需要的lib,配置文件,class一样也不缺。

              其实这里要说一个概念,spring-boot在打包后,会把文件拷贝到BOOT-INF/Classes之下,这个时候你原来定义的扫描包路径将失效。而这个问题官方文档根本没讲,还是我没有看到。

              这个陷阱在你使用packages定义扫描路径的时候等着你。或者获取工程下文件的时候。对于获取文件的话,可以在原路径前加上classes,当然你要区分开发环境或生产环境的话,你可以使用profile或者conditional来解决。如果是扫描包路径就恶心了,因为你加上classes之后,不报file not found了。而是不报错,只是警告你找不到hibernate的某些xml。但是你很可能根本没有使用hibernate。
     

    参考博客:https://blog.csdn.net/guduyishuai/article/details/60968728

    parent工程pom文件:

    <?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/xsd/maven-4.0.0.xsd">
    
        <modelVersion>4.0.0</modelVersion>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.6.RELEASE</version>
        </parent>
    
        <groupId>com.demo</groupId>
        <artifactId>demo-parent</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
    
        <modules>
            <module>demo-base</module>
            <module>demo-sync</module>
            <module>demo-pattern</module>
        </modules>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <springboot.version>1.5.6</springboot.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
            </dependency>
            <!--WEB层-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--测试-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-ribbon</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <!-- framework启动器 模板引擎 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-freemarker</artifactId>
            </dependency>
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-redis</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-redis</artifactId>
                <version>1.3.7.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
            </dependency>
            <!-- Mybatis -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.2.8</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>1.3.2</version>
            </dependency>
    
            <!--fastjson-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.8</version>
            </dependency>
            <!-- 分页助手 -->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper</artifactId>
                <version>3.7.5</version>
            </dependency>
            <dependency>
                <groupId>com.github.jsqlparser</groupId>
                <artifactId>jsqlparser</artifactId>
                <version>0.9.1</version>
            </dependency>
            <!-- 通用Mapper -->
            <dependency>
                <groupId>com.github.abel533</groupId>
                <artifactId>mapper</artifactId>
                <version>2.3.4</version>
            </dependency>
            <!-- MySql连接驱动 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            <!-- 连接池 -->
            <dependency>
                <groupId>com.jolbox</groupId>
                <artifactId>bonecp-spring</artifactId>
                <version>0.8.0.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <exclusions>
                    <exclusion> <!-- exclude掉spring-boot的默认log配置 -->
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-logging</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!-- log4j日志 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-log4j2</artifactId>
            </dependency>
    
            <!-- 有其他jar依赖log4j -->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-1.2-api</artifactId>
                <version>2.8.2</version>
            </dependency>
    
            <dependency>
                <groupId>com.lmax</groupId>
                <artifactId>disruptor</artifactId>
                <version>3.3.6</version>
            </dependency>
            
    		<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
    		<dependency>
    		    <groupId>org.dom4j</groupId>
    		    <artifactId>dom4j</artifactId>
    		    <version>2.1.0</version>
    		</dependency>
    
            <!--在线文档-->
            <!--swagger本身不支持spring mvc的,springfox把swagger包装了一下,让他可以支持springmvc-->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>2.6.1</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>2.6.1</version>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Camden.SR7</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
        <build>
            <plugins>
                <!-- 资源文件拷贝插件 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <configuration>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
                <!-- java编译插件 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    base工程pom文件:

    <?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/xsd/maven-4.0.0.xsd">
    
        <artifactId>demo-base</artifactId>
        <modelVersion>4.0.0</modelVersion>
    
        <parent>
            <groupId>com.demo</groupId>
            <artifactId>demo-parent</artifactId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    				<configuration>
    					<classifier>exec</classifier>
    				</configuration>
    			</plugin>
    		</plugins>
    	</build>
    	
    </project>
    

    sync的pom文件:

    <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/xsd/maven-4.0.0.xsd">
     
      <artifactId>demo-sync</artifactId>
      <modelVersion>4.0.0</modelVersion>
     
      <parent>
        <groupId>com.demo</groupId>
        <artifactId>demo-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
      </parent>
      
      <dependencies>
      	<dependency>
      		<groupId>com.demo</groupId>
      		<artifactId>demo-base</artifactId>
      		<version>1.0-SNAPSHOT</version>
      	</dependency>
      </dependencies>
      
    </project>
    

     

    展开全文
  • visual studio项目,C++一个解决方案里不同的项目之间不能相互依赖吗? 众所周知,在一个visual studio solution种可能由多个project组成,这些project会存在依赖关系。规定每个project是一个模块,所有的模块都是...
    visual studio项目,C++一个解决方案里不同的项目之间不能相互依赖吗?
    众所周知,在一个visual studio solution种可能由多个project组成,这些project会存在依赖关系。
    规定每个project是一个模块,所有的模块都是单向的依赖方式。比如界面模块依赖于操作模块,操作模块依赖于数据模块.

    也就是说。A项目依赖于B项目的情况下(A项目调用B项目的类,函数),B项目是没办法#include A项目中的类的(即B项目没办法包含A项目的类,从而调用A项目的类和方法,否则的话B项目也就依赖于A项目了,而A项目与B项目之间是不能相互依赖的)。

    那么,如果我们在编写C++项目时,出现耦合的现象呢。比如说,界面模块A依赖于操作模块B,但是在设计过程中,我发现操作模块B需要用到界面模块A的数据,或者说界面A与操作B一定要有交互,这时候就没办法解决了吗?

    在项目编写过程中,我们的项目中出现了相互依赖的问题。经过讨论研究,最终实现了项目之间的相互依赖。有需要的朋友可以看一下,在这里分享给大家。

    项目前提是:界面项目A依赖于操作项目B,但是操作项目B中发现一定要调用界面项目A中的对话框,并且要将操作项目B包含类的数据通过A中的对话框进行修改(项目B依赖于项目A,反向依赖了)。实现方法如下:

    一、在操作项目B中定义一个UI管理的基类OperationUIManager ,并定义一个纯虚函数ShowDialogSetWallSize(OperationDrawWall* operadrawwall) ,其中OperationDrawWall* operadrawwall是操作项目B中某一个Class的指针。然后定义一个Static静态的基类OperationUIManager的指针static OperationUIManager* m_pOperationUIManager 初始化为NULL(注意:这个地方是关键。m_pOperationUIManager初始为NULL,类OperationUIManager在B项目中是没办法被指向的,也就是分配一块全局的内存给OperationUIManager的指针。具体实现指向要在项目A中实现,接下来会讲

    .h

    class  HOUSE_OPERATION_DLL OperationUIManager 
    {
    public:
    	OperationUIManager(){}
    protected:
    	static OperationUIManager* m_pOperationUIManager;
    public:
    	virtual void ShowDialogSetWallSize(OperationDrawWall* operadrawwall) =0;
    	static OperationUIManager* GetManager();
    };
    .cpp

    OperationUIManager*  OperationUIManager::m_pOperationUIManager = NULL;
    OperationUIManager* OperationUIManager::GetManager()
    {
    	return m_pOperationUIManager;
    }

    二、由于界面项目A是依赖于操作项目B的,那么我们在项目A中定义一个继承自项目B中的基类OperationUIManager的一个子类DesignUIManger,并在子类DesignUIManger中实现项目B类OperationDrawWall与项目A中对话框SetWallSizeDialog的数据交互。

    这里我们采用单例模式给子类DesignUIManger分配一块全局的内存,(单例模式是什么,不明白的朋友可以自己百度一下)。

    首先,由于在项目B中的父类OperationUIManager中我们定义了一个初始为NULL的父类指针static OperationUIManager* m_pOperationUIManager ,我们需要在项目A中对这个父类指针进行赋值,将子类指针New出来的地址赋给父类指针OperationUIManager::m_pOperationUIManager = this;(这句话的含义是:我在项目A中New出一块子类的内存,并将这个子类的内存地址给父类的指针,这样才能在项目B中通过纯虚函数调用项目A的虚函数,也就是实现了反向依赖)实例化DesignUIManger的位置我是放在了MainFrame的构造函数里,需要使用的朋友可以自己设置位置。

    其次,我们在父类OperationUIManager中定义过一个纯虚函数virtual void ShowDialogSetWallSize(OperationDrawWall* operadrawwall) =0;现在,我们已经获得OperationUIManager* m_pOperationUIManager指向子类DesignUIManger的指针了。这时候,我们就可以通过项目B中OperationUIManager的纯虚函数ShowDialogSetWallSize(OperationDrawWall* operadrawwall)将项目B中类OperationDrawWall的指针传递到项目A中,并在项目A中实现数据交互。代码如下:

    单例模式

    .h

    template<class T>
    class SingletonInterface
    {
    public:
    	static T* GetInstance()
    	{
    		m_bSingletonCreating = true;
    		static T singleton;
    		m_bSingletonCreating = false;
    
    		return &singleton;
    	}
    
    protected:
    	SingletonInterface() {}
    	SingletonInterface(const SingletonInterface&);
    	SingletonInterface& operator=(const SingletonInterface&);
    
    	static bool m_bSingletonCreating;
    };
    template<class T> bool SingletonInterface<T>::m_bSingletonCreating = false;
    .cpp

    #include "stdafx.h"
    #include "HouseData/SingletonInterface.h"
    项目A中的子类

    .h

    class OperationDrawWall;
    class  DesignUIManger :public SingletonInterface<DesignUIManger>,public OperationUIManager
    {
    private:
    	DesignUIManger();
    	DesignUIManger(const DesignUIManger&);
    	DesignUIManger& operator=(const DesignUIManger&);
    	friend class SingletonInterface<DesignUIManger>;
    public:
    	virtual void ShowDialogSetWallSize(OperationDrawWall* operadrawwall);
    };
    .cpp

    void DesignUIManger::ShowDialogSetWallSize(OperationDrawWall* operadrawwall)
    {
    	SetWallSizeDialog setsizedlg(operadrawwall);
    	setsizedlg.DoModal();
    }
    
    DesignUIManger::DesignUIManger()
    {
    	OperationUIManager::m_pOperationUIManager = this;
    }


    然后我在界面项目A中MainFrame里实例化子类的代码是:

    DesignUIManger* m_pDesignUIManager = DesignUIManger::GetInstance();
    纯粹是单例模式,然后实例化并获取全局内存区的指针。

    在项目B中OperationDrawWall类里,我调用基类的代码是:

    OperationUIManager::GetManager()->ShowDialogSetWallSize(this);
    这里this就是OperationDrawWall的指针,相当于将项目B的指针传到了项目A中,与项目A实现数据交互。


    总结,这种实现相互依赖的方法,严格来说没有打破C++项目单向依赖的规则,层次关系上,被依赖的项目B依然是项目A的父级,不同的是,通过子级A对父级B的指针m_pOperationUIManager进行了重新赋值,父级(也就是B)也就获得到了子级A的类的指针(实现反向依赖),并在子级A里实现了数据交互。

    真是好大一盘棋,需要的朋友可以自己研究一下,欢迎指教。








    展开全文
  • springboot 项目多模块已成开发大势所趋,抽出一个parent父工程,子模块基础模块(包含一些公用的实体类和工具类等),以及其他子模块(Module A、 Module B …)。Module A 以及Module B工程都需要依赖子模块工程。 问题: ...

    场景:

    springboot 项目多模块已成开发大势所趋,抽出一个parent父工程,子模块基础模块(包含一些公用的实体类和工具类等),以及其他子模块(Module A、 Module B …)。Module A 以及Module B工程都需要依赖子模块工程

    问题:

    在对Module A进行打包时,出现问题:Module A中所依赖的子模块工程的util程序包不存在。即使能打包成功,用java -jar启动jar包也会报Class Not Found,依赖的子模块工程的类找不到。

    错误如下:

    maven-compiler-plugin:3.8.1:compile
    package xxx does not exist 
    

    解决方案:

    未解决之前在子模块工程的pom.xml中maven插件的配置如下:

        <build>  
            <plugins>  
                <plugin>  
                    <groupId>org.springframework.boot</groupId>  
                    <artifactId>spring-boot-maven-plugin</artifactId>  
                </plugin>  
            </plugins>  
        </build>  
    

    解决子模块工程的pom.xml的maven配置如下:

        <build>  
            <plugins>  
                <plugin>  
                    <groupId>org.springframework.boot</groupId>  
                    <artifactId>spring-boot-maven-plugin</artifactId>  
                    <configuration>  
                        <classifier>exec</classifier>  
                    </configuration>  
                </plugin>  
            </plugins>  
        </build>  
    

    原因分析:

    spring-boot-maven-plugin打包出来的jar是不可依赖的

    我们现在整合后的maven项目有一个parent工程,打包类型为pom,下面多个spring-boot工程作为它的module,分别为子模块和moduleA,moduleB。假如moduleA依赖于子模块。如果你在子模块中使用了spring-boot-maven-plugin的默认配置build,或者在parent工程中使用spring-boot-maven-plugin的默认配置build。那么在clean package的时候会发现moduleA找不到子模块中的类。原因就是默认打包出来的jar是不可依赖的。

    解决方案:

    ​ 官方告诉我们,你如果不想移代码,好吧,我这样来给你解决,给你打两个jar包,一个用来直接执行,一个用来依赖。于是,你需要指定一个属性classifier,这个属性为可执行jar包的名字后缀。比如我设置<classifier>exec</classifier>,原项目名为Vehicle-business。那么会得到两个jar:Vehicle-business.jar和Vehicle-bussiness-exec.jar

    ​ 官方文档位置:84.5 Use a Spring Boot application as a dependency

    ​ 总结:回到聚合maven上,如果你在parent工程中使用了spring-boot-maven-plugin作为builder,那么你的依赖module一定要用解决方案二来设置。否则你不在parent工程中用spring-boot-maven-plugin作为builder,而在需要打包的module上使用。

    一般parent工程的maven插件配置如下**😗*

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                 <configuration>
              		<source>1.8</source>
              		<target>1.8</target>
            	</configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    被依赖的maven子模块的maven插件配置如下**(其余maven子模块就不需要配置)😗*

     <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

    其他的坑:

    1.jdk8一定要指明

    ​ 不指明的话在开发工具里运行没有一点问题,如果你没有用到java8的特性打包也没有问题。一旦你用到了java8的特性,而且使用spring-boot-maven-plugin作为builder,一定要指明jdk版本。不然你会收到类似不识别Lambda,请使用resource8这样的错误。

    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
      </properties>
    

    2.BOOT-INF陷阱

    ​ 这个问题就很恶心了。这个时候你已经打包成功,你会发现运行jar的时候报错为file not found,而且不告诉你是什么文件。你打开jar去看,发现需要的lib,配置文件,class一样也不缺。

    ​ 其实这里要说一个概念,spring-boot在打包后,会把文件拷贝到BOOT-INF/Classes之下,这个时候你原来定义的扫描包路径将失效。而这个问题官方文档根本没讲,还是我没有看到。

    ​ 这个陷阱在你使用packages定义扫描路径的时候等着你。或者获取工程下文件的时候。对于获取文件的话,可以在原路径前加上classes,当然你要区分开发环境或生产环境的话,你可以使用profile或者conditional来解决。如果是扫描包路径就恶心了,因为你加上classes之后,不报file not found了。而是不报错,只是警告你找不到hibernate的某些xml。但是你很可能根本没有使用hibernate。

    参考博客:https://blog.csdn.net/guduyishuai/article/details/60968728

    parent工程pom文件:

    <?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/xsd/maven-4.0.0.xsd">
     
        <modelVersion>4.0.0</modelVersion>
     
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.6.RELEASE</version>
        </parent>
     
        <groupId>com.demo</groupId>
        <artifactId>demo-parent</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
     
        <modules>
            <module>demo-base</module>
            <module>demo-sync</module>
            <module>demo-pattern</module>
        </modules>
     
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <springboot.version>1.5.6</springboot.version>
        </properties>
     
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
            </dependency>
            <!--WEB层-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
     
            <!--测试-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-ribbon</artifactId>
            </dependency>
     
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <!-- framework启动器 模板引擎 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-freemarker</artifactId>
            </dependency>
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-redis</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-redis</artifactId>
                <version>1.3.7.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
            </dependency>
            <!-- Mybatis -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.2.8</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>1.3.2</version>
            </dependency>
     
            <!--fastjson-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.8</version>
            </dependency>
            <!-- 分页助手 -->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper</artifactId>
                <version>3.7.5</version>
            </dependency>
            <dependency>
                <groupId>com.github.jsqlparser</groupId>
                <artifactId>jsqlparser</artifactId>
                <version>0.9.1</version>
            </dependency>
            <!-- 通用Mapper -->
            <dependency>
                <groupId>com.github.abel533</groupId>
                <artifactId>mapper</artifactId>
                <version>2.3.4</version>
            </dependency>
            <!-- MySql连接驱动 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            <!-- 连接池 -->
            <dependency>
                <groupId>com.jolbox</groupId>
                <artifactId>bonecp-spring</artifactId>
                <version>0.8.0.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <exclusions>
                    <exclusion> <!-- exclude掉spring-boot的默认log配置 -->
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-logging</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!-- log4j日志 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-log4j2</artifactId>
            </dependency>
     
            <!-- 有其他jar依赖log4j -->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-1.2-api</artifactId>
                <version>2.8.2</version>
            </dependency>
     
            <dependency>
                <groupId>com.lmax</groupId>
                <artifactId>disruptor</artifactId>
                <version>3.3.6</version>
            </dependency>
            
    		<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
    		<dependency>
    		    <groupId>org.dom4j</groupId>
    		    <artifactId>dom4j</artifactId>
    		    <version>2.1.0</version>
    		</dependency>
     
            <!--在线文档-->
            <!--swagger本身不支持spring mvc的,springfox把swagger包装了一下,让他可以支持springmvc-->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>2.6.1</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>2.6.1</version>
            </dependency>
        </dependencies>
     
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Camden.SR7</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
        <build>
            <plugins>
                <!-- 资源文件拷贝插件 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <configuration>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
                <!-- java编译插件 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
     
    </project>
    

    子模块工程pom文件:

    <?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/xsd/maven-4.0.0.xsd">
     
        <artifactId>demo-base</artifactId>
        <modelVersion>4.0.0</modelVersion>
     
        <parent>
            <groupId>com.demo</groupId>
            <artifactId>demo-parent</artifactId>
            <version>1.0-SNAPSHOT</version>
        </parent>
     
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    				<configuration>
    					<classifier>exec</classifier>
    				</configuration>
    			</plugin>
    		</plugins>
    	</build>
    	
    </project>
    

    sync的pom文件:

    <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/xsd/maven-4.0.0.xsd">
     
      <artifactId>demo-sync</artifactId>
      <modelVersion>4.0.0</modelVersion>
     
      <parent>
        <groupId>com.demo</groupId>
        <artifactId>demo-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
      </parent>
      
      <dependencies>
      	<dependency>
      		<groupId>com.demo</groupId>
      		<artifactId>demo-base</artifactId>
      		<version>1.0-SNAPSHOT</version>
      	</dependency>
      </dependencies>
      
    </project>
    
    展开全文
  • 项目需求:因业务需求增加 可能后期会增加很多新功能 故使用多模块开发 项目目录: 多模块之间maven的互相依赖 上面的图片已经很形象的描述了多模块之间的关系 当需要用到其他的模块时 在maven中添加需要用到的...
  • maven模块依赖

    千次阅读 2015-08-01 10:51:01
    “分天下为三十六郡,郡置守,尉,监” —— 《史记·秦始皇本纪》 ...我们明明在开发一个项目,划分模块后,导入Eclipse变成了N个项目,这会带来复杂度,给开发带来不便。   为了解释原因,
  • idea2020-springboot项目-多级父子工程(聚合工程)子模块相互引用依赖无法install(启动项目)问题 目录 文章目录1、简介2、问题3、解决4、总结***后记*** : 内容 1、简介 此项目目前为3级springboot开发,maven...
  • 我们大型项目开发时可能每个人的分工都不一样,对应的模块任务也不同,那么就会需要使用到Maven的模块化功能,举个简单的例子: 眼下有项目A、项目B、项目C,每个项目对应的业务都不同,但是存在20%左右的重复代码...
  • 在SpringBoot多个模块开发过程中,如果模块有互相依赖的情况下,那么在打包的时候,会有问题,自己研究了半天,把我遇到的问题和解决办法,给大家分享一下. 项目目录 其中的straw-commons为被依赖模块,其他的模块依赖这...
  • 为了防止传递依赖,我们...本篇文章介绍多模块开发,我们做过Maven项目的都知道,我们的项目一般都是分模块的,每个模块都会对应着一个POM.xml文件,它们之间通过继承和聚合(也称多模块,multi-module)相互关联。
  • 模块开发

    千次阅读 2016-11-08 23:22:12
    1.什么是模块化? 模块指的是具有相同属性和行为的事物的集合。 在前端中,我们习惯将一些属性比较类似和行为比较类似的内容放在同一个js文件里面...模块化指的就是遵守commonjs规范,解决不同js模块之前相互调用问题
  • Android模块开发

    千次阅读 2017-08-18 20:21:02
    模块之间相互解耦,协同开发不容易出错 实际使用后,项目打包后的体积也小了很多 2.遇到的问题和解决方案 模块之间的数据传递 模块之间使用ARouter进行跳转 采用事件总线的方式,自定义RxBus进行数
  • 理解模块化和依赖管理(一)

    千次阅读 2016-12-19 14:16:37
    js模块化与依赖管理
  • 解决maven循环依赖

    万次阅读 2017-01-10 11:31:53
    开发中, 应尽量避免循环依赖 如果存在, 则是业务不明了, 需要改造,...2.可以添加一个模块C, 使用插件build-helper-maven-plugin, 让模块A, 模块B都去依赖模块C, 而不相互依赖 模块C的pom.xml如下, 将模块-manager和模
  • 模块开发是指在程序开发中,可以将每个功能脚本或文件单独提炼出来作为一个个独立的模块模块之间相互关联,相互依赖,并对外暴露出一个入口文件。既方便开发者自己引用,也方便他人下载使用。比如前端经常用到的...
  • 问题: 1.springboot多模块maven父子工程...在多module的环境下,jar包之间相互依赖,这时候打包的时候就会有先后顺序的问题。 在项目开发后打包的时候发现通过原始建立的多module的项目会出现问题; 原始的spri...
  • Gradle 与 Android的相互依赖

    千次阅读 2017-11-24 11:02:26
    一个模块可以是一个Android应用模块,或者是一个Android依赖模块,但不可两者皆是。 在使用Android插件时,不仅可以配置针对Android的特殊约定,还可以生成只应用于Android的任务,下面的代码是由插件来定义的...
  • 很容易想到,多个pom文件中的dependency难免会有重复的(两个模块依赖同一个dependency很常见),而且每个dependency都有version需要管理,也可能出现冲突不一致等配置问题。 父子模块间单纯的继承关系也有问题,...
  • 说明:可能遇到MavenWeb项目依赖的项目会被打成jar包,放到Maven web项目的的lib下。也就是说MavenWeb项目依赖的项目的修改,不会立即生效。右击Maven web设置静态依赖     转载于...
  • Android 开发:由模块化到组件化(一)

    万次阅读 多人点赞 2016-12-15 01:43:15
    当你看到这的时候,想必心理一阵恶寒:模块化?组件化?到底是什么鬼?有啥区别. 有这种感觉才是对的,模块化和组件化本质思想是一样的,都是"大化小",两者的目的都是为了重用和解耦,只是叫法不一样.如果非要说区别,那么...
  • web前端模块开发

    千次阅读 2016-03-14 20:49:24
    定义与由来定义模块就是实现特定功能的相互独立的一组方法。由来背景 随着网站逐渐的开发,嵌入网页的js代码越来越庞大,而网页也越来越像桌面程序,需要一个团队去分工协作,进行管理和测试等等。为了更好的管理...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 102,684
精华内容 41,073
关键字:

如何解决开发模块相互依赖