Menu

  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay
  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay

IntelliJ IDEA知识集锦

29
Jan
2016

IntelliJ IDEA知识集锦

By Alex
/ in Java
/ tags IntelliJ
0 Comments
简介

IDEA是一个历史悠久的Java集成开发环境,它始于2001年,以智能化著称。IDEA基于IntelliJ平台,分为社区版、商业版。IDEA目前自带JRE,此JRE仅仅用于IDEA的运行,不能做开发用。

核心概念
工程(Project)

在IDEA中,你总是在“工程”的上下文中工作,工程代表了一个完整的软件解决方案,包括代码助手、重构、代码风格一致性在内的功能都在工程内进行。

工程本身不包含开发相关的内容,例如源码、构建脚本或者文档。它主要用于组织模块并提供公共的设置。模块才是代码的容器。

工程格式和元数据文件

IDEA使用普通的XML文件来存储工程的配置信息、及其包含的组件。并支持两种存储工程配置的格式:

基于目录的格式

在工程目录下的 .idea 子目录中存放配置,该子目录包含一系列XML文件,包括:compiler.xml、encodings.xml、modules.xml等

这些文件记录工程本身的核心信息,包括:模块组件的名称和位置、编译器设置等,可以存放到VCS。一个例外是workspace.xml,该文件存储个人设置(例如窗口位置)以及其它附属于开发环境的信息,不应该存放到VCS

基于文件的格式

在工程目录中使用两类文件:

  1. *.ipr存储工程核心信息
  2. *.iws存储个人设置

IDEA允许在这两种格式之间进行转换:File ⇨ Save as Directory-Based Format

模块(Module)

模块是工程中一个可以独立编译、运行、调试、测试的单元。模块的配置信息默认存放在其内容根目录(Content root folder)下的 .iml 文件中,该文件一般存放到VCS。

Content Root

Content root指的是包含模块所有文件目录。IDEA允许一个模块拥有多个Content root,但是通常都是一个。

某些时候没有Conent root的模块会有特殊用途,例如用来指定一组依赖关系。

目录类型与图标

IDEA使用不同图标来区分模块中不同的目录。你可以在目录上右键 ⇨ Mark Directory As来设置目录的类型。常用的目录类型及图标包括:

图标 目录类型说明
moduleFolder Content Root:标识一个模块的内容根目录
folder 普通目录
rootSource 源代码根目录,如果把某个目录分配为此类型,则IDEA会在构建过程中编译其中的源代码
rootGeneratedSourceIJ 自动生成的源代码根目录
rootTest 测试源代码根目录,用于将测试代码和产品代码隔离
rootGeneratedTestSourceIJ 自动生成的测试源代码根目录
rootResourceIJ 资源文件根目录,在构建过程中会原样拷贝到输出目录
rootTestResourceIJ 测试资源文件根目录
rootExcluded

排除目录,这类目录“几乎”被IDEA忽略
该目录中的代码得到受限制的代码提示,外部目录中的代码的自动完成列表不会出现该目录中的内容,搜索时IDEA忽略此目录

将某些不重要的目录设置为排除目录,可以提高IDE的性能

依赖

一个模块的依赖是指,该模块使用的(因而依赖于的)其它实体。一个模块依赖可以是:模块使用的SDK、模块使用的库、相同工程中的其它模块。术语“模块依赖”专指第三种。

依赖的优先级由Project Structure ⇨ Modules ⇨ Dependencies页签指定,你可以手工调整顺序:

Selection_005

顺序决定了在编译期间,javac寻找类的优先级;也决定了运行时(普通Java程序)寻找类的优先级。 

Facet

Facet代表模块使用的框架、技术或者语言。一个模块可以添加多个Facet,使用某些Facet可能需要下载框架组件。

构件(Artifact)

在IDEA中构件这一术语,可以指定两个不同却相关的事物:

  1. 构件可以指你期望从工程输出的内容的规则(specification)
  2. 构件可以指上述规则的实际产出

构件可以简单的是一个或者多个模块打包而成的JAR、WAR或者EAR,对于后两者,Web/Java EE Application的Facet相关的资源会一并打包到WAR/EAR中。你也可以生成自定义格式的构件。

简而言之,构件允许你把(一个或者多个模块)编译后的代码、关联的库、资源文件、元数据文件(例如Facet的部署描述符)等一并成一个可部署的单元。

构件还可以包含其它构件。

库

库是指在你的模块中以只读方式使用的、已编译的代码的集合。

库可以附带源码、API文档,这可以方便的进行Debug,或者在IDE中查看inline文档。

库的级别

你可以定义三种级别的库:

库级别 说明
全局(IDE) 这类库可以被任何工程使用,即它们可以被加入到任何工程的任何模块的依赖列表中
工程 这类库可以被工程内部所有模块使用
模块 这类库只能被单个模块使用
应用服务器库

这类库允许你使用特定于某种JavaEE服务器/Servlet容器的类。每当你添加了一个应用程序定义后,IDEA会自动创建相应的应用服务器库:

Choose Libraries_001

路径变量

为了减少在开发机器之间转移工程的复杂性,IDEA引入路径变量(path variables),路径变量指向一个目录/文件的绝对路径。当使用位于工程外部的第三方库时,路径变量特别有用。

Scope

在IDEA中Scope表示一组文件、包或者目录。使用Scope你可以得到一个过滤后的视图,用于关注于特定操作。对于大规模的工程来说,Scope特别有效。IDEA提供了一系列预定义的Scope,你还可以自定义Scope。

你可以在Project工具窗口中浏览Scope。

Scope的类型

可以分为两类:

  1. Shared Scopes:可以供团队成员使用,存放在.idea/scopes目录或*.ipr中(这也是为什么工程元数据可能需要提交到VCS的原因)
  2. Local Scopes:自己本地使用
预定义Scope
Scope 说明
Project Files 包含工程内容根目录下所有的文件,模块依赖一般不包含在其中
Problems 工程内容根目录下存在错误的文件
Project 包含Project Files以及所有模块依赖
Production 类似于Project,但是排除测试相关的目录文件
Tests Project中出去Production的部分
Changed Files 修改后的文件
Open files 在编辑器中打开的文件
Current file 编辑器中当前显示的文件
Selected files 当前被选中的文件(例如在Project工具窗口中)
编译和构建

所谓编译,就是指把*.java源文件通过javac/eclipse/ajc等编译器处理,生成*.class文件。

所谓构建,是指编译源代码、拷贝资源文件,必要的情况下进行打包。

编译、构建的结果,总是存放在工程/模块的输出目录下,默认的输出目录为out,使用Maven时一般为target。

在IDEA的Build菜单下,有多个相似的菜单项,说明如下:

菜单项 说明
Make Project 只编译修改过的文件,使用的最多,对于大型工程比Rebuild节约时间
Make Module ...
Compile ... 强制编译单个文件,不管上次编译依赖是否修改过
Rebuild Project 强制重新构建整个工程,默认的会在构建之前清空输出目录
Build Artifact 创建构件,对于exploded类型的构件,仅仅是将散装的构件目录存放到输出目录中
在Tomcat中运行构件时,直接把上述构件目录作为Web应用的根目录
全局设置
设置路径 说明 
B,E,D  ⇨ Compiler 勾选Make project automatically,修改代码后IDEA会自动编译Java类
B,E,D ⇨ Build Tools ⇨ Maven 取消勾选Always update snapshots,勾选会导致总去远程仓库下载
Maven home directory设置为/home/alex/JavaEE/maven/3.0.5
User settings file 设置为/home/alex/JavaEE/config/maven-settings.xml,勾选Override
B,E,D ⇨ Build Tools ⇨ Maven ⇨ Importing 勾选Import Maven projects automatically,保持Maven工程模型和IDEA工程模型之间的同步
勾选Automatically download Sources
B,E,D ⇨ Build Tools ⇨ Maven ⇨ Repositories 选中Remote Repository,执行Update操作
B,E,D ⇨ Application Servers 配置应用服务器
常用快捷键

下表列出的快捷键,全部基于Eclipse的Keymaps。

快捷键 说明
Ctrl + Shift + Alt + S 打开工程结构对话框,可以进行工程、模块、依赖库等方面的设置
Web应用开发
创建Web工程
  1. File ⇨ New ⇨ Project,弹出New Project对话框
  2. 切换到Java Enterprise选项卡,选择合适的Java EE version。默认情况下是Java EE 7
  3. 切换到Java选项卡,选择合适的Project SDK。注意,这里可以添加JDK,以后的工程自动感知已添加的JDK
  4. 勾选Java EE ⇨ Web Application,Servlet规范的版本会显示在下面
  5. 下一步,给工程命名并指定目录位置,完成
添加JavaEE库

工程src目录右击 ⇨ New ⇨ Servlet,创建任意一个Servlet,IDEA会触发错误提示,原因是没有找到Servlet API。

在代码中红色HttpServlet文字上Alt + Enter,Add Java EE 6 JARs to module dependencies。在弹出对话框中点选Download,然后点击Configure,参考喜下图设置:

Selection_012

确定后,IDEA会下载JavaEE库。这些库会在Project Structure的Platform Settings ⇨ Global Libraries中出现,并且被当前工程自动引用。Servlet中的报错会消失,JSP也可以获得代码自动完成提示了。

部署到服务器
配置构件

File ⇨ Project Structure,切换到Artifacts,配置“构件”(如果使用Maven或者Gradle等构建工具,则不需要在此配置)。参考下图:

Selection_008

默认的,IDEA已经生成一个构件——解包(exploded)部署的war。点击add可以定义新的构件,构件类型包括JAR、WAR、EAR、JavaFx应用等等。

在右侧窗格,你可以修改构件的名称、输出目录。勾选Build on make,则在构建工程时,IDEA会自动生成此构件。

在下面的Output Layout选项卡中,可以定义构件包含的内容、目录结构:

  1. 在此选项卡的左侧,可以为构件添加目录、归档文件,或者添加工程组件的一个拷贝——例如模块的编译输出(Module Output)、目录和文件、JavaEE资源等
  2. 在此选项卡的右侧,可以双击,把某个元素添加到构件默认位置,或者拖拽到构件的任意位置。已经添加过的元素,不显示
配置服务器

File ⇨ Settings ⇨ B,E,D ⇨ Application Servers,点击add可以配置新的服务器。IDEA支持绝大部分主流的JavaEE应用/Web服务器。

部署构件

Run ⇨ Edit Configurations,点击add创建新的运行/调试配置。以Tomcat为例,选择Tomcat Sever ⇨ Local。在右侧窗格顶部可以设置此配置的名称,例如“Tomcat v8.0 Server at localhost:8080”。右侧窗格有多个选项卡,可以分别进行配置:

选项卡 说明
Server

选择先前配置过的Application Server,指定JVM参数,Tomcat端

On 'Update' action,指定Update操作(Ctrl + F10)的行为,对应Run/Debug工具窗口中的Selection_009按钮

On frame deactivation可以指定当IDEA失去焦点(切换到其它程序)后执行的操作,对应Run/Debug工具窗口⇨Deployment选项卡中的Selection_010按钮

配置参考图如下:Selection_011

Deployment 指定服务器启动时需要部署的构件,对于War构件,可以为其指定一个Application Context,对应了URL 
Logs 指定在Run/Debug工具窗口中显示哪些服务器日志(每个日志占据一个选项卡 )
Code Coverage 进行代码覆盖率检查的配置 
Startup/Connection 指定Debug、Run或者Coverage时执行的命令行、JVM参数、环境变量

在选项卡的下面,还有一个Before launch配置,可以指定启动服务器之前需要执行的动作。 

运行Web应用

在工具栏上选择运行配置Selection_013,然后点击右侧的Selection_004按钮,IDEA将启动应用服务器(运行/调试模式)并且部署Web应用。

在运行期间,依据运行配置的On Update action、On frame deactivation设置,IDEA可能自动把更新后的类、资源文件同步到服务器。你可以在Application Servers工具窗口中查看服务器代码是不是最新的:

Selection_015

如果某个构件后面跟着[Republish],你可以点击Selection_016按钮,将最新的代码同步到服务器。

当你从结构上更改一个类,比如修改了一个方法的签名,或者修改某个框架的配置文件,IDEA无法进行热部署,必须重启服务器。此时你可以借助JRebel插件。

智能提示

参考:WebStorm智能提示

下载库

下载一个官方库后,IDEA会弹出一个对话框,你有机会将库添加为某个模块的依赖:

Choose Modules for ExtJS GPL-4.2_001

被添加JS库依赖的模块,可以在Project Structure ⇨ Modules对话框点选模块,然后在右侧Dependencies中看到此依赖:

Project Structure_002

遗憾的是,通过add按钮你只能添加Java库,看不到JS库,这可能是个BUG。

自定义库

自定义库在IDEA 2016.1下无法工作(你没有机会将其添加为模块依赖),可能是BUG 。

手工解决办法是,先添加好自定义库,然后修改相关模块的.iml文件,添加:

pems-web-manager.iml
XHTML
1
2
3
4
5
6
    <!-- 添加类似下面的一行 -->    
    <!-- name为你的自定义库的名称 -->
    <!-- 如果你的库的Type是Global则level设置为application,否则设置project -->
    <orderEntry type="library" name="ExtJS 4.1.1" level="application" />
  </component>
</module>

修改完毕后立即生效。

从Eclipse迁移
IDEA没有工作区

IDEA没有工作区(Workspace)这一概念,这意味着你同时只能(在一个窗口)处理一个工程(Project)。在Eclipse中,你常常把若干个相互关联的工程在同一工作区中打开,在IDEA中你必须将它们组织为单个工程的多个模块。对于不相关的工程,建议在多个IDEA窗口中打开。

Eclipse和IDEA中重要术语的对应关系如下表:

Eclipse IntellJ IDEA
Workspace Project
Project Module 
Facet Facet
Library Library
JRE  SDK 
Classpath variable Path variable
IDEA没有Perspective

IDEA同样没有透视图(Perspective)的概念,这个特点和Visual Studio类似,但和Eclipse迥异。在Eclipse中你可以切换到不同的透视图,来完成相应的工作,IDEA则没有这个必要,IDEA会智能的管理工具窗口——类似于Eclipse中的视图(View),这些窗口会在和当前任务相关时显示。

你可以拖拽以重新排列工具窗口,或者设置其为浮动模式。通过Window ⇨ Store Current Layout as Default可以保存当前工具窗口的布局,对以后所有工程生效。

某些工具窗口可以和编辑器联动,在工具窗口标题上栏上点击右键:

  1. Autoscroll to Source:点击工具窗口中的条目后,编辑器自动切换到对应文件或者代码行
  2. Autoscroll from Source:切换编辑器或代码行后,自动选中工具窗口中匹配的条目

这两项功能默认都是关闭的。Scroll from Source可以通过locate按钮手工触发。

无需“保存”

IDEA会自动保存修改后的文件,并且能够从Local History中撤销重构。你之前不停按Ctrl + S的习惯可以改改了。IDEA会在编译、关闭文件时、IDE失去焦点时自动存储文件到磁盘。你还可以在A & B ⇨ System Settings 中设置IDE空闲多长时间后自动保存。

编译方式

默认情况下IDEA不会自动的编译代码。你可以开启自动编译,但是当有程序在运行时,自动编译不会执行,此时你必须Ctrl + F9强制编译。

Eclipse使用自己的编译器,而IDEA默认使用JDK中的javac。Eclispse编译器对错误更加容忍,有些时候允许运行不能通过编译的代码。要切换到Eclipse编译器,可以B,E,D ⇨ Compiler ⇨ Java Compiler,设置Use compiler。要允许执行无法编译的代码,需要在Run/Debug Configurations中把Make替换为Make, no error check

代码助手

要执行类似于Eclipse的Quick fix(Ctrl + 1),可以Alt + Enter。

要自动生成构造器、Getter/Setter,可以Alt + Insert。

IDEA的自动完成功能更加智能化,也比较复杂,分为:基本自动完成、次要基本自动完成、智能完成、次要智能完成、语句补全。

按Ctrl + J 可以插入模板代码,按Ctrl + Alt + J可以用模板围绕选中代码。你可以在Editor ⇨ Live Templates添加自己的模板。

IDEA支持特别的Postfix自动完成,你可以在Editor ⇨ General ⇨ Postfix Completion中查看可用的Postfix模板。

运行与调试

前面提到过,即使你设置了自动编译,在程序运行时IDEA不会自动编译。这样代码就不会Auto reload,要自动重新载入改变的类,你需要:

  1. 对于普通Java程序:明确构建Ctrl + F9
  2. 对于服务器上的程序:通过Ctrl + F10更新服务器
与构建工具集成

目前Java领域流行的构建工具包括Maven、Gradle,IDEA对它们提供了良好的内置支持。

当你创建/导入一个Maven/Gradle工程后,可以自由的修改pom.xml、build.gradle。修改这些配置文件引发潜在的构建配置发生的改变必须最终同步到IDEA的工程模型中。当你在配置文件中声明WAR等构件时,IDEA会自动配置Project Structure ⇨ Artifacts下的IDEA构件。

要手工完成上述同步,可以在Maven/Gradle工具窗口中点击Selection_001按钮。要启用自动化同步,可以:

  1. 对于Maven:B,E,D ⇨ Build Tools ⇨ Maven ⇨ Importing,勾选Import Maven projects automatically
  2. 对于Gradle:B,E,D ⇨ Build Tools ⇨ Gradle,勾选Use auto-import

注意:

  1. IDEA允许任何Maven Goal或者Gradle Task在“运行”之前执行(通过Run/Debug Configuration设置)
  2. 当在IDEA中执行编译、构建操作时,IDEA使用自己的构建流程。此流程一般会比较快,但是可能和Maven/Gradle构建的结果不一致,当不一致发生时,你可以使用Maven goal或者Gradle task代替IDEA的Make
Maven
自动触发执行

在Maven Projects工具窗口,你可以右击生命周期阶段或者目标,并指定在Make/Rebuild/Run之前/后自动触发执行。

target目录
子目录/文件 说明
classes IDEA的Make、Rebuild操作生成的产品Java类、资源文件目录
Maven相关goal生成的产品Java类、资源文件目录
test-classes IDEA的Make、Rebuild操作生成的测试Java类、资源文件目录
Maven相关goal生成的测试Java类、资源文件目录
artifactid-version

IDEA的Build Artifacts操作生成的artifactid:war explodeed构件的存放目录
Maven相关goal生成的解包格式的war的存放目录,已经正确处理好overlay+excluded

注意:

  1. 在Tomcat上执行构件时,Tomcat的Context的docBase就是该目录,即不需要像Eclipse那样从target拷贝文件到外部的tmpN目录
  2. 对Tomcat执行Update操作后,最新的已加载类、最新的资源文件自动同步到该目录
  3. 如果该目录由Maven生成,后续对构件进行Build操作,不会破坏maven-war-plugin的excluded规则
  4. 如果该目录由Maven生成,后续对构件进行Rebuild操作,则maven-war-plugin的excluded规则被破坏
artifactid-version.war IDEA的Build Artifacts操作生成的artifactid:war构件
Maven相关goal生成的war,已经正确处理好overlay+excluded
war/work maven-war-plugin工作目录,存放参与overlay且尚未exclude的war包的所有文件
实例:既有复杂工程的迁移
工程简介

这是一个真实的、已经维护了多年的工程,由5个Maven工程组成,其中一个包含11个Maven模块。这些工程使用了AspectJ编译时织入、maven-war-plugin的overlay、Spring、Hibernate等框架或插件。

创建IDEA容器工程

Create New Project ⇨ Empty Project,创建一个空白的容器工程:

New Project_001

这样的工程创建后,工程内容根目录中除了.idea目录外没有任何内容。打开此工程后,IDEA自动打开Project Structure对话框,提示添加模块。

选择待导入模块

为了便于管理,我们把工程牵涉到的模块(一系列Maven工程)从VCS签出,存放在新工程pems-trunk的根目录下。然后点击add ⇨  Import Module,选择从工程根目录导入,如下图:

Select File or Directory to Import_001

点击OK,出现如下对话框:

Import Module_001

选择Maven,点击Next。注:通过Maven Projects工具窗口中的add进行导入,与此导入方式效果一样。

Maven工程导入

点击Next后,出现如下对话框:

Import Module_001

设置如下:

  1. 勾选Search for projects recurively,以便递归的在子目录中查找Maven工程
  2. 勾选Keep project file in,指定一个位置(例如.idea目录,或者工程根目录),可以集中的存放*.iml文件,避免对纯Maven工程的污染
  3. 勾选Create IntelliJ IDEA modules for aggregator projects,为多模块Maven工程的每个模块分别创建IDEA模块
  4. 勾选Create module groups for multi-module Maven projects,自动为多模块Maven工程创建模块分组

点击下一步,选择合适的Maven profile,再次下一步,出现类似如下界面:

Import Module_002

该界面列出所有待导入的Maven工程的列表,注意,对于多模块Maven工程,只有容器工程(packaging=pom)才会出现在此列表中。

点击Next,选择IDEA工程使用的Project SDK,保持和Maven工程的JDK版本要求一致,然后点击Finish完成导入。我多次尝试,设置Project SDK没有效果,必须手工到Project Structure ⇨ Project Settings ⇨ Project中设置,在这个工程中,需要设置Project SDK为1.6、Project language level为6。

IDEA工程结构

导入完毕后,在Project工具窗口中,可以看到如下的IDEA模块(组):

Selection_004

可以看到,IDEA对pems、security-monitoring两个Maven工程创建了模块分组,包含模块配置的*.iml文件存放在IDEA工程的根目录下。

打开Project Structure ⇨ Modules,可以看到IDEA成功识别到工程使用了AspectJ,并且自动配置了AspectJ Facet:

Project Structure_002

最好在Settings ⇨ B,E,D ⇨ Java Compile设置一下IDEA的ajc的Command line parameters,和aspectj-maven-plugin保持一致,例如

Shell
1
-showWeaveInfo -XnoInline -outxml -Xlint:ignore -1.6 

打开Project Structure ⇨ Artifacts,可以看到IDEA自动处理了Overlay:

Project Structure_003

打开Settings ⇨ B,E,D ⇨ Compiler ⇨ Java Compiler,可以看到编译器被设置为Ajc。尽管我们在pom.xml中并没有指定对aspectjtools的依赖,但是IDEA很聪明的猜测到了它的位置。

需要注意的是,IDEA完全是依据POM中的依赖列表来识别AspectJ和Overlay,与aspectj-maven-plugin、maven-war-plugin插件的配置无关。IDEA不会(像Eclipse的m2e Connector那样)识别这些插件进而改变IDEA工程模型

解决问题
overlay的excludes支持

上面我们提到过,IDEA可以成功识别WAR的overlays,但是它却不支持maven-war-plugin的excludes规则:

pom.xml
XHTML
1
2
3
4
5
6
7
8
9
10
11
<overlay>
    <groupId>com.kingsmartsi</groupId>
    <artifactId>pems-rpt</artifactId>
    <excludes>
        <exclude>WEB-INF/lib/sshe-utils-*.jar</exclude>
        <exclude>WEB-INF/lib/security-monitoring-core-*.jar</exclude>
        <exclude>WEB-INF/lib/comm-tools-*.jar</exclude>
        <exclude>WEB-INF/lib/commons-lang-*.jar</exclude>
        <exclude>WEB-INF/lib/commons-logging-*.jar</exclude>
    </excludes>
</overlay>

这导致本来需要排除掉的内容进入需要部署war构件,例如上面的pems-web-manager:war exploded。要解决此问题,你可以逐个修改参与overlay的war构件,将不需要的内容从它本身的输出列表中排除,例如:

Menu_002

排除掉某些JAR包后,IDEA会作为错误看待,并且显示在Project Structure 左侧面板的“Problems”中,构件上也被打上波浪线提示。要去除这些提示很简单,只需要把这些构件的Type改为“Other”即可:

Project Structure_001

你可能发现这种处理方式太过繁琐,下面有两种备选方案:

  1. 运行Tomcat前,调用maven-war-plugin插件的Goal生成pems-web-manager:war exploded构件的目录内容。这样就可以遵循excludes规则,后续的Build Artifacts操作也不会破坏此规则。默认的IDEA在启动Tomcat前自动执行Build Artifacts操作
  2. 不使用maven-war-plugin的overlay的excludes功能。以该工程为例,excludes的目的是排除掉低版本的commons-lang:1.0,这完全可以(也应当)用Maven传递性依赖排除机制来实现
找不到@AnyMetaDef的问题

这个比较奇葩,工程内有两个Hibernate实体类,引用了同一个 @AnyMetaDef(name="device") 注解。之前我们为了减少重复代码,让这两个类共享一个@AnyMetaDef,即:在其中一个类上定义@AnyMetaDef,另外一个类仅仅通过 @Any ( metaDef = "device" ) 引用。

现在的问题是,在Eclipse下部署到Tomcat,@AnyMetaDef必须定义在A类上;在IDEA下部署到Tomcat,@AnyMetaDef必须定义在B类上。否则就会报错:Unable to find @AnyMetaDef for an @(ManyTo)Any mapping ...

看样子和类的加载顺序有关系,而这两个类的加载顺序受运行环境的影响。

最简单的解决办法就是重复定义一个@AnyMetaDef并指定不一样的名字,由于@Any很少用到,这不会导致过分的维护压力。

JavaScript智能提示缓慢

当工程内包含大量JavaScript时,会验证增加IDEA分析代码的压力,此时你可以把不需要参与搜索、代码分析的:

  1. 目录 Mark Directory As ⇨ Excluded
  2. JS文件 Mark as Plain Text

但是要注意,Excluded的目录不会发布到Tomcat服务器,可能会导致404错误。 

创建新的Maven模块

最好通过命令行来添加,通过IDEA的GUI添加可能出现问题,取决于项目的组织方式。

部署和运行

参考Web应用开发一节创建一个Tomcat服务器,把pems-web-manager:war exploded、sshe-static:war exploded两个构件添加到Run/Debug Configurations的Deployment选项卡,然后在Server选项卡设置合适的参数:

Run-Debug Configurations_002

设置完毕后点击确定,在工具栏选择此Run/Debug Config,点击debug或execute即可启动Tomcat。

按照上图的配置,运行期间发生修改(或新添加)的类、资源文件会在切换到其它窗口后、Update操作后(Ctrl + F10)自动同步到Tomcat服务器,同步后IDEA会在Run/Debug工具窗口上方弹出类似下面的气泡提示:Selection_003

打包

应当使用Maven来打包,首先为所有顶级Maven工程创建Run/Debug Config,Command line可以设置为 clean install -Dmaven.test.skip=true ,然后创建一个额外的Confg调用它们。点击Before launch下面的add ⇨ Run Another Configuration,调用pems依赖的所有Maven工程的的打包命令:

Run-Debug Configurations_001

常见问题
无法连接到Maven仓库

IntelliJ IDEA本身的网络代理配置,不会影响到Maven命令的执行,因此,你需要配置Maven代理。参见:Maven知识集锦

运行Tomcat时把构件部署在哪

IDEA不会拷贝构件到其它目录,直接使用out/target目录下构建好的目录或者war包。

以Maven工程为例,如果使用exploded构件,那么:

  1. 一般方式启动Tomcat:使用/target/artifactid-version/中的类和Web资源。目录artifactid-version由Build Artifacts动作生成
  2. JRebel方式启动Tomcat:使用/target/classes中的类、使用/src/main/webapp下的Web资源
删除文件后Tomcat不同步

如果你把资源文件存放在src/main/java下,那么删除这些资源文件后,exploded构件目录不会同步。放在src/main/resources下则没有此问题。

创建Maven项目无法获得原型列表

一直显示:loading archetype list,但是无法加载完毕。

解决办法:

  1. 尝试删除/home/alex/.IntelliJIdeaxxxx.xx/system/maven目录后重试
  2. 尝试修改Preferences ⇨ Build Tools ⇨ Maven ⇨ Importing,修改 VM options for importer 为-Xmx1024m后重试
编译时织入Debug无法看到本地变量

例如和Spring联用时,调试注解了@Transactional的方法的时候,Debug工具窗口看不到本地变量的信息。

解决办法: Settings ⇨ B,E,D  ⇨ Compiler  ⇨ Java Compiler,设置Ajc Options / Command line parameters,添加 -preserveAllLocals

此外还有提示 'this' is not available的情况,可以改用 ajc$this代替this。

和Docker集成时如何配置容器

目前很多Docker的CLI选项Docker Integration插件不识别。手工编写的JSON file示例如下:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
    "HostConfig": {
        "NetworkMode": "local",
        "Dns": [
            "172.21.0.1",
            "178.79.131.110",
            "223.6.6.6"
        ]
    },
    "NetworkingConfig": {
        "EndpointsConfig": {
            "local": {
                "Gateway": "172.21.0.99"
            }
        }
    }
}

上面的例子示例了如何配置容器的网络参数,注意MAC、IP地址参考docker inspect的结果或者docker-java进行设置没有效果。 

修改CVS日志时间格式

要使用yyyy-MM-dd HH:mm格式的时间,为Intellij提供环境变量

Shell
1
export LC_TIME=sv_SE
分享这篇文章到:
← Framework7学习笔记(二):组件
Go语言并发编程 →

Leave a Reply Cancel reply

您可以使用以下网站的账户登录:

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Related Posts

  • Protocol Buffers初探
  • WebStorm知识集锦
  • CLion知识集锦
  • IntelliJ平台知识集锦
  • RubyMine知识集锦

Recent Posts

  • Terraform快速参考
  • 草缸2021
  • 编写Kubernetes风格的APIServer
  • 记录一次KeyDB缓慢的定位过程
  • eBPF学习笔记
ABOUT ME

汪震 | Alex Wong

江苏淮安人,现居北京。目前供职于腾讯云,专注容器方向。

GitHub:gmemcc

Git:git.gmem.cc

Email:gmemjunk@gmem.cc@me.com

ABOUT GMEM

绿色记忆是我的个人网站,域名gmem.cc中G是Green的简写,MEM是Memory的简写,CC则是我的小天使彩彩名字的简写。

我在这里记录自己的工作与生活,同时和大家分享一些编程方面的知识。

GMEM HISTORY
v2.00:微风
v1.03:单车旅行
v1.02:夏日版
v1.01:未完成
v0.10:彩虹天堂
v0.01:阳光海岸
MIRROR INFO
Meta
  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org
Recent Posts
  • Terraform快速参考
    简介 Terraform用于实现基础设施即代码(infrastructure as code)—— 通过代码( ...
  • 草缸2021
    经过四个多月的努力,我的小小荷兰景到达极致了状态。

  • 编写Kubernetes风格的APIServer
    背景 前段时间接到一个需求做一个工具,工具将在K8S中运行。需求很适合用控制器模式实现,很自然的就基于kube ...
  • 记录一次KeyDB缓慢的定位过程
    环境说明 运行环境 这个问题出现在一套搭建在虚拟机上的Kubernetes 1.18集群上。集群有三个节点: ...
  • eBPF学习笔记
    简介 BPF,即Berkeley Packet Filter,是一个古老的网络封包过滤机制。它允许从用户空间注 ...
  • IPVS模式下ClusterIP泄露宿主机端口的问题
    问题 在一个启用了IPVS模式kube-proxy的K8S集群中,运行着一个Docker Registry服务 ...
  • 念爷爷
      今天是爷爷的头七,十二月七日、阴历十月廿三中午,老人家与世长辞。   九月初,回家看望刚动完手术的爸爸,发

  • 6 杨梅坑

  • liuhuashan
    深圳人才公园的网红景点 —— 流花山

  • 1 2020年10月拈花湾

  • 内核缺陷触发的NodePort服务63秒延迟问题
    现象 我们有一个新创建的TKE 1.3.0集群,使用基于Galaxy + Flannel(VXLAN模式)的容 ...
  • Galaxy学习笔记
    简介 Galaxy是TKEStack的一个网络组件,支持为TKE集群提供Overlay/Underlay容器网 ...
  • Istio中的透明代理问题
    为何需要透明代理 Istio的Sidecar作为一个网络代理,它拦截入站、出站的网络流量。拦截入站流量后,会使 ...
  • Cilium学习笔记
    简介 Cilium Cilium是在Docker/K8S之类的容器管理平台下,透明的为应用程序服务提供安全网 ...
  • 彩彩 2020年6月黄崖关

  • 总部远眺 2020年5月深圳

  • 绚丽之花 寻味顺德

  • tuanbolake 团泊湖野餐

TOPLINKS
  • Zitahli's blue 91 people like this
  • 梦中的婚礼 64 people like this
  • 汪静好 61 people like this
  • 那年我一岁 36 people like this
  • 为了爱 28 people like this
  • 小绿彩 26 people like this
  • 彩虹姐姐的笑脸 24 people like this
  • 杨梅坑 6 people like this
  • 亚龙湾之旅 1 people like this
  • 汪昌博 people like this
  • 2013年11月香山 10 people like this
  • 2013年7月秦皇岛 6 people like this
  • 2013年6月蓟县盘山 5 people like this
  • 2013年2月梅花山 2 people like this
  • 2013年淮阴自贡迎春灯会 3 people like this
  • 2012年镇江金山游 1 people like this
  • 2012年徽杭古道 9 people like this
  • 2011年清明节后扬州行 1 people like this
  • 2008年十一云龙公园 5 people like this
  • 2008年之秋忆 7 people like this
  • 老照片 13 people like this
  • 火一样的六月 16 people like this
  • 发黄的相片 3 people like this
  • Cesium学习笔记 88 people like this
  • IntelliJ IDEA知识集锦 59 people like this
  • 基于Kurento搭建WebRTC服务器 38 people like this
  • PhoneGap学习笔记 32 people like this
  • NaCl学习笔记 32 people like this
  • 使用Oracle Java Mission Control监控JVM运行状态 29 people like this
  • 基于Calico的CNI 27 people like this
  • Ceph学习笔记 26 people like this
  • Three.js学习笔记 24 people like this
Tag Cloud
ActiveMQ AspectJ CDT Ceph Chrome CNI Command Cordova Coroutine CXF Cygwin DNS Docker eBPF Eclipse ExtJS F7 FAQ Groovy Hibernate HTTP IntelliJ IO编程 IPVS JacksonJSON JMS JSON JVM K8S kernel LB libvirt Linux知识 Linux编程 LOG Maven MinGW Mock Monitoring Multimedia MVC MySQL netfs Netty Nginx NIO Node.js NoSQL Oracle PDT PHP Redis RPC Scheduler ServiceMesh SNMP Spring SSL svn Tomcat TSDB Ubuntu WebGL WebRTC WebService WebSocket wxWidgets XDebug XML XPath XRM ZooKeeper 亚龙湾 单元测试 学习笔记 实时处理 并发编程 彩姐 性能剖析 性能调优 文本处理 新特性 架构模式 系统编程 网络编程 视频监控 设计模式 远程调试 配置文件 齐塔莉
Recent Comments
  • 黄豆豆 on Ginkgo学习笔记
  • cloud on OpenStack学习笔记
  • 5dragoncon on Cilium学习笔记
  • Archeb on 重温iptables
  • C/C++编程:WebSocketpp(Linux + Clion + boostAsio) – 源码巴士 on 基于C/C++的WebSocket库
  • jerbin on eBPF学习笔记
  • point on Istio中的透明代理问题
  • G on Istio中的透明代理问题
  • 绿色记忆:Go语言单元测试和仿冒 on Ginkgo学习笔记
  • point on Istio中的透明代理问题
  • 【Maven】maven插件开发实战 – IT汇 on Maven插件开发
  • chenlx on eBPF学习笔记
  • Alex on eBPF学习笔记
  • CFC4N on eBPF学习笔记
  • 李运田 on 念爷爷
  • yongman on 记录一次KeyDB缓慢的定位过程
  • Alex on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • haolipeng on 基于本地gRPC的Go插件系统
  • 吴杰 on 基于C/C++的WebSocket库
  • 绿色记忆:Nginx知识集锦 on Apache HTTP Server知识集锦
  • NotMeBug on AspectJ编程学习笔记
©2005-2023 Gmem.cc | Powered by WordPress