Idea IDE 常见问题
[1]初次 install 或者 package 工程很慢
Maven 使用的基本逻辑
在 Maven 的术语中,仓库是一个位置(place)。
Maven 仓库是项目中依赖的第三方包库,这个库所在的位置叫做仓库。
Maven 仓库有三种类型:
- 本地(local)
- 中央(central)
- 远程(remote)
Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。
运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
为什么初次 Install 会很慢?
- 可能本工程中所使用的包并不是你常用的包,本工程的包尽可能用最新版本的代码,所以第一次使用会下载很多的包。根据自身网络的不同,依赖包的下载速度也会不同,编译所需要的时间也会不同。
- 可能目前你所使用的,还是默认的 Maven 源,默认的 Maven 源是国外源,通常访问都会很慢,甚至有访问响应超时的情况。根据自身网络的不同,依赖包的下载速度也会不同,编译所需要的时间也会不同。
- 为了方便调试单体版以及支持
Spring Boot Admin
查看 git 信息和 Docker 打包,在编译过程中工程默认是开启了源代码打包
、Git信息打包
以及资源包拷贝
功能的,因为有更多的操作,势必会增加编译打包的时间。
提升编译速度的办法
- 提现下载好依赖包
初次使用本项目,在执行 Install
或 Package
命令之前,打开 Idea Maven 面板,点击工具栏的刷新按钮,手动触发依赖包的下载,等所有包下载完成之后再在执行 Install
或 Package
命令进行编译。刷新方式如下图所示:
说明
如果是使用 Idea,以直接从 Git 中 Clone 的方式创建的项目,那么在代码下载完成之后,通常会自动下载相关的依赖包
提示
可能会出现,虽然依赖包都下载完成了,但是 Idea Maven 面板中,仍旧存在一些依赖包“飘红”的现象。这是 Idea 没有实时读取完整依赖包的问题,只要能正常编译通过,就不会有任何问题。下次再打开 Idea 通常就不会有标红的内容。
- 更改为使用阿里 Maven 源。
如果你熟悉怎么改请略过,如果不熟悉,在线文档中:基础知识-> 本地开发环境中有说明具体怎么配置 Maven 以及本地源。配置方法
- 关闭编译辅助工具
可以在工程根目录中的 pom.xml 中,将对应 profiles 里面的 <skip.build.source.package>、<skip.copy.docker.resource>、<skip.build.git.commit.info> 三个属性值改为 true。这样可以减少打包内容,提升打包速度。
<profile>
······
<properties>
······
<!--跳过构建源代码包-->
<skip.build.source.package>false</skip.build.source.package>
<!--不copy代码包到docker构建目录-->
<skip.copy.docker.resource>false</skip.copy.docker.resource>
<!--不执行git commit 构建-->
<skip.build.git.commit.info>false</skip.build.git.commit.info>
······
</properties>
</profile>
- 修改为多线程编译
在 IDEA 中,默认是使用单线程进行 Maven 编译的。可以将其修改为多线程编译方式,可以提高一定的编译速度。
在 Idea 中,找点击 Settings... -> Build,Execution,Deployment -> Build Tools -> Maven
。在 Maven 配置面板中。将 Thread Count 的值设置为 1C。这样可以进行多线程打包,提升打包速度,如下图所示:
[2]found character '@' that cannot start any token. (Do not use @ for indentation)
启动服务时,出现以下错误
16:01:05.726 [main] ERROR org.springframework.boot.SpringApplication - Application run failed
org.yaml.snakeyaml.scanner.ScannerException: while scanning for the next token
found character '@' that cannot start any token. (Do not use @ for indentation)
in 'reader', line 7, column 13:
active: @profile.name@
^
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:439)
at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:248)
at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingValue.produce(ParserImpl.java:633)
at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:165)
at org.yaml.snakeyaml.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:59)
at org.yaml.snakeyaml.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:45)
at org.yaml.snakeyaml.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:140)
at org.yaml.snakeyaml.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:119)
at org.yaml.snakeyaml.composer.Composer.composeScalarNode(Composer.java:221)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:191)
at org.yaml.snakeyaml.composer.Composer.composeKeyNode(Composer.java:309)
at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:300)
at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:288)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:195)
at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:313)
at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:304)
at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:288)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:195)
at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:313)
at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:304)
at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:288)
at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:195)
at org.yaml.snakeyaml.composer.Composer.getNode(Composer.java:115)
at org.yaml.snakeyaml.constructor.BaseConstructor.getData(BaseConstructor.java:135)
at org.springframework.boot.env.OriginTrackedYamlLoader$OriginTrackingConstructor.getData(OriginTrackedYamlLoader.java:99)
at org.yaml.snakeyaml.Yaml$1.next(Yaml.java:512)
该问题主要是由于 bootstrap.yml
中使用了 @ @
变量,而在 target
目录中生成的 bootstrap.yml
中的 @ @
变量没有被正确替换。
解决办法
办法一
使用 mvn install
或 mvn package
命令重新编译工程。
办法二
在 IDEA 中,打开Maven
面板,点击刷新按钮。如下图所示:
[3]Error running XXXApplication. Command line is too long. Shorten the command line via JAR manifest or via a classpath file and rerun
可以查询到的解决版本,基本上是通过修改 .idea
文件夹下的 idea/workspace.xml
文件解决。
这种办法并不是特比优雅,而且在最新的版本中不一定会起效。
比较简单的办法,是通过 IDEA 界面,修改配置即可以解决。具体操作如下:
步骤一
在 IDEA 工具栏中,找到 Edit Configurations ...
,如下图所示。
步骤二
在弹出的 Edit Configurations ...
对话框中,首先找到运行时会出现 Command line is too long
应用名称。
以 UpmsApplication
为例,选中该应用,在右侧面板中,找到 Environment --> Shortent command line
, 将该设置的值修改为 JAR manifest
即可解决。如下图所示: