今天的工作任务
将之前项目依赖于私有仓库nexus 改为使用默认或者阿里镜像打包运行。
将本地开发环境移动到云上。
Q: 如何判断已经使用私有仓库,并且更改了groupId 、artifactId及version 的jar,应该替换成哪个jar呢?
A: 首先通过查看本地的Maven repository 地址,找到私有云加载到本地的jar资源,如:xxx/com/xxxx。目录结构,之后再到对应的jar文件,进行解压。查看META-INF(这个目录是Maven打包生成的)目录下找到pom.properties。其中就有对应真实的groupId等信息。
在上maven repository 网站找到对应的,依赖配置文件,进行替换就可以了。
刚刚说的是开源文件从私有仓库,替换为公共镜像地址的流程。
如果是私有jar,只能通过项目引用的方式进行了。
通过添加对应scope 和systemPath标签可以进行引用。
<dependency> <groupId>com.zuifuli</groupId> <artifactId>icare-open-sdk</artifactId> <version>1.2.3</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/icare-open-sdk-1.2.3.jar</systemPath> </dependency>
还有一种方式
mvn install:install-file -DgroupId=com.test -DartifactId=juint -Dversion=1.0.0 -Dpackaging=jar -Dfile=juint.jar
这种方式个人觉得,如果依赖多的话 还需要经常操作。比较麻烦就没有尝试使用。
Q:使用第二种更改配置的方法 可能会出现java.lang.NoClassDefFoundError问题
A: 原因是scope 使用范围的问题:
maven打war包 可以使用
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <webResources> <resource> <directory>${project.basedir}/libs</directory> <targetPath>WEB-INF/libs</targetPath> <filtering>true</filtering> <includes> <include>**/*.jar</include> </includes> </resource> </webResources> </configuration> </plugin>
jar 包的话 可以使用:
<resources> <resource> <directory>${project.basedir}/src/main/resources</directory> <targetPath>BOOT-INF/lib/</targetPath> <filtering>true</filtering> <includes> <include>**/*.jar</include> </includes> </resource> <!-- <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> --> </resources>
Q: Exception in thread "main" java.lang.IllegalStateException: Failed to get nested archive for entry BOOT-INF/lib/icare-open-sdk-1.2.3.jar
A: 是因为这个jar 存在问题,导致无法加载
T:Spring Boot 通过Maven 打包生成的jar包,结构中目前包括三个目录:
- org 这个目录是Spring 加载jar和class文件使用的,通过java -jar 运行,现执行其中的class文件 ,其中的JarFile,JarEntry.. 默认加载BOOT-INT/lib 其中的jar 依赖 和BOOT-INT/class 项目文件
- BOOT-INF:存在源文件和项目依赖的jar
- META-INF:maven打包生成的一些配置文件
Q: 为什么通过添加Maven配置,打入BOOT-INF/lib jar 变大了呢?并且无法正常解压使用(265kb-488kb)
<dependency> <groupId>com.zuifuli</groupId> <artifactId>icare-open-sdk</artifactId> <version>1.2.3</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/icare-open-sdk-1.2.3.jar</systemPath> </dependency> <resources> <resource> <directory>${project.basedir}/src/main/resources</directory> <targetPath>BOOT-INF/lib/</targetPath> <filtering>true</filtering> <includes> <include>**/*.jar</include> </includes> </resource> <!-- <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> --> </resources>
A: 这个问题没有继续探索,而是了一种加载本地资源的方式 。这次成功运行了。
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <nonFilteredFileExtensions> <nonFilteredFileExtension>ttf</nonFilteredFileExtension> </nonFilteredFileExtensions> </configuration> </plugin> <!-- 这个plugin 是我添加的 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <includeSystemScope>true</includeSystemScope> </configuration> </plugin> <!-- <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> <compilerArguments> <extdirs>${project.basedir}/src/main/resources</extdirs> </compilerArguments> </configuration> </plugin> --> </plugins>