idea启动项目(本地jar包)的配置

一、 nohup java -jar jarName-0.0.1-SNAPSHOT.jar >msg.log 2>&1 &;

java -Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=256M -jar a.jar 分配内存
nohup java -Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=256M -jar blade-admin.jar >log.log 2>&1 &

二、配置jar包启动方式为远程调试启动

找到jar所在路径,进入cmd窗口,命令如下,监听启动5005端口(和程序的端口8089没关系)-远程调试启动语句:

java -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n -jar mac-test-0.0.1-SNAPSHOT.jar

// 普通jar包启动语句java -jar mac-test-0.0.1-SNAPSHOT.jar --spring.profiles.active=test >> /var/log/mac-test.log 2>&1 & 说明:spring.profiles.active=test :对应多环境配置的情况,test指的是测试环境,对应application-test.properties 配置文件,意思是运行测试环境的配置 /var/log/mac-test.log :指把程序运行的日志全部输出到/var/log 下 mac-test.log文件中。一般项目都会配置日志框架,比如log4j等。启动会配置具体的日志输出路径。

详解:

nohup

nohup命令运行由Command参数和任何相关的Arg参数指定的命令,忽略所有挂断(SIGHUP)信号。

在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup命令,添加 &(表示“and”的符号)到命令的尾部。

nohup是no hang up的缩写,就是不挂断的意思。

nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。

该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。

在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中。

nohup和&的区别

&:指在后台运行,但当用户推出(挂起)的时候,命令自动也跟着退出

nohup:不挂断的运行,注意并没有后台运行的功能,,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,

例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行。

nohup java -jar jarName-0.0.1-SNAPSHOT.jar >msg.log 2>&1 &;

在上面的例子中,0:stdin (standard input),1:stdout (standard output),2:stderr (standard error);

2>&1是将标准错误(2)重定向到标准输出(&1),标准输出(&1)再被重定向输入到msg.log文件中。

nohup java -jar -Xms200M -Xmx500M *.jar --spring.profiles.active=prod --server.port=7002 >logs/*.log 2>&1 &
————————————————

jar包:直接通过内置Tomcat运行,不需要额外安装Tomcat。如需修改内置Tomcat的配置,只需要在SpringBoot的配置文件中配置。内置Tomcat没有自己的日志输出,全靠jar包应用输出日志。但是比较方便,快速,比较简单。
war包:传统的应用交付方式,需要安装Tomcat,然后放到wabapps目录下运行war包,可以灵活选择Tomcat版本,可以直接修改Tomcat的配置,有自己的Tomcat日志输出,可以灵活配置安全策略,相对打成jar包来说没那么快速方便。

Project Structure
主要配置File-Project Structure(项目结构)-Project Settings(项目设置)下的五个配置项

Project(项目):项目相关设置

Modules(模块):模块相关设置

Libraries(库):依赖jar包相关设置

Facets:确认信息相关设置

Artifacts(工件):打包相关设置

————————————————

本文继续理解IDEA对项目、模块的管理。管理项目是一个IDEA的基本功能,但往往最基础的是最重要的更是最容易被忽略的。因此本文是你更好去理解IDEA管理maven结构、gradle结构、Spring Boot项目结构的基础,万丈高楼平地起,它就是这个地基。上层结构再怎么繁繁多变,殊途同归最终都由Project Structure来体现,从而给开发者以几近相同的编码体验。

正文

Project Structure是一个你开发过程中偶尔/经常会打开,但却很少用心留意的窗口。不同于一般设置窗口,它和项目的紧密度非常的高且有一定理解难度,若设置不当项目可能无法运行甚至无法编码(比如编译报错、jar包找不着等),为此我做件一般人都不愿意做的事,对它进行详解,相信做难事必有所得。

本文基于上文已搭建好的hello项目案例,继续研究其项目结构Project Structure的管理。从结构查看,到修改定制,那么问题来了,如何打开一个Project项目的结构页呢?

如何打开Project Structure?

看似一个简单的操作,里面其实蕴藏着你对IDEA Project和Module的理解,否则势必不知从哪下手。据了解,也许你是多年的程序员,也未必知道从哪下手。

按照一般思维,会鼠标选中hello,然后右键:

但对不起,右键菜单里并无Project Structure选项。Project Structure顾名思义,是针对Project维度的结构视窗,而你鼠标选中的hello只是个module,所以自然弹出的是对此module的操作菜单喽,而非Project的。也许你可能会讲:我点击了Open Module Settings也打开了Project Structure视窗呀,是的效果上你可能是打开了但道理并非如此,而仅仅是因为把它俩放在了一起(同一视窗)而已。

  • 理解IDEA的Project和Module两大概念,是对IDEA进行一切操作的基础。前文已非常详细(可能是全网最全)的介绍了它俩,可花几分钟前往学习。点这里电梯直达

三种打开方式

要打开一个Project的结构展示窗口,至少有如下三种办法,本文都例举给你。

1.顶部菜单File -> Project Structure

2.点击右上角的快捷按钮

3.快捷键方式(推荐)

这是我本人最喜欢的方式,至于快捷键是哪个就看你是如何设定的喽,我的快捷键是ctrl + shift + alt + s。

建议你操作IDEA多用快捷键,那会大大提高编码的效率,并且看起来像高手。基本上记住50个左右快捷键就够用了,长期以往成了肌肉记忆后这就是你的核心竞争力之一了

打开hello项目的结构页如下图所示:

解释:为何不需要鼠标选中项目?

对于这个动作,敏感的你是否有发现:打开项目结构并不需要鼠标选中任何东西(快捷键随意使用),也就是说鼠标失焦状态都没问题,何解呢?

回答这个问题并不难,前提是你已经对IDEA的Project概念烂熟于胸。一个Project对应一个视窗,它们是严格1:1的关系。换句话讲,当前视窗就代表着Project,因此操作本视窗顶部菜单栏就肯定是作用在该Project上,又何须专门选中什么呢?再者,Project只是个逻辑概念,你想选都没得选中的,所以把视窗当作它就好。有没有觉得,这和Java中的this关键字调用特别像?

最后,这个问题的答案是:只要鼠标还在IDEA视窗内(该视窗是活跃窗口),那么对Project就永远就是“选中”状态。

Project Structure项目结构剖析

项目结构视窗已打开,那接下来重点来喽。可以看到它左边的“菜单栏”,共分为三个part:

  • Project Settings:项目设置(最重要),本文详解
  • Platform Settings:平台设置,也叫全局设置。用于管理SDK们(如JDK、Kotlin的SDK等)、全局库。

一般来讲,全局的JDK都会配置在此处,比如我因为经常要做多版本尝试,就管理了多个JDK版本

  • Problems:问题。一般项目出现了问题都会在此体现(如依赖不一致问题等等),总之问题数量一致让它是0是最优的

其中Project Settings里面的每个标签页是最常用,最关心的。下面就对它的每个tab页作出解释和使用说明。

Project页情况

此视窗可以看到Project本身的基础信息。如:名称、SDK版本、语言等级等等,比较简单。

对于此页面的元素,多啰嗦几句:

1.为何是SDK版本而不是JDK版本?答:因为IntelliJ IDEA是JVM平台IDEA,不仅仅支持Java还有其它语言如Kotlin,所以写成SDK更抽象

2.为何指定了SDK还要指定语言等级?答:因为SDK版本并不直接决定语言等级。如你用的JDK 11,但依旧可以把语言等级调为8来进行编译/运行

这是集成开发环境的优势所在,轻松对多环境进行定制化支持

3.SDK和语言等级Project都可指定,作为全局默认

这些配置Module默认集成,但可自行修改自己的。比如module 1使用Java 5编译,module 2使用Java 11编译,这是允许的

Module页情况

Module页可谓是重点中的重点,甚至是最重要。毕竟Module作为实际存在形式,所有的源代码、配置、依赖等都在这里,因此大有可学呀。

值得注意:Tests测试包里面的是可以访问Sources源码的,但反过来不行。

 

 

每个模块都能独立管理着自己的依赖,这种关系在模块自己的.iml文件中记录着。

知识点:

  1. Project创建时默认会创建一个同名的Module模块
  2. Module默认沿用Project的SDK、语言等级等设置,当然也可自己指定
  3. 每个Module可自行管理依赖,可以是二方库、三方库......
  4. 本模块的依赖情况默认存储在项目的{moduleName}.iml文件里

新增依赖

既然Module可以自行管理依赖,那么如何给该模块新增依赖呢?

举个例子,现在需要向hello模块增加一个commons-io jar包依赖,可以点击Dependencies标签页左下角的+号,选择Library:

然后选择,如果没有就选择New Libarary...创建一个呗(有就直接用就成):

下面分别演示选择Java和选择From Maven两种不同库的方式:

新建Java依赖库

New Library新建菜单选项中选择Java选项:

这种方式简单的讲:从你本机里选择一个jar(或者一个目录里面包含jar、文档)就成。优点是非常轻便,不依赖网络,缺点是这些jar必须是你本机已实际存在的。

新建Maven依赖库

New Library新建菜单选项中选择From Maven选项:

输入GAV(或者关键字查找)就能定位到jar,此种方式使用起来其实非常方便,毕竟maven非常好用嘛。缺点自然就是一般情况下需要都需要依赖于网络喽,除非你本地仓库已存在对应的jar。

通过这两种方式各执行一次添加新的依赖完成后,再看hello模块的依赖情况,效果如图:

既然依赖变化了,自然而然的也会体现在hello.iml文件里喽,来看看:

依赖添加进来,源代码里就可以正常使用啦:

依赖作用范围

在New Library创建依赖的时候,不管用哪种方式选中后,它都会弹出这个窗口让你选择此依赖的作用范围

  • Module Library:模块级别,只能本模块使用,别的模块看都看不见
  • Project Library(默认选中):项目级别,该项目下所有的模块均能看见和选中使用
  • Global Library:全局级别,任何项目均可看见和使用

在本例中commons-io是模块级别,commons-lang3是项目级别。因此hello-client模块添加依赖时也是能够看到commons-lang3这个依赖的(但看不见commons-io):

Libraries页情况

当某Library是所有/大部分模块都需要的依赖时,就可以上升为Project级别的依赖,抽取到Libraries标签页来统一管理。如图,因为上面步骤创建的commons-lang3是项目级别的,所以也会出现在这里。

至于如何创建/添加Project级别的依赖,这里就不用再赘述了吧,上面【新增依赖】章节已讲得很明白。唯一区别在该页面选好后不用再选择Library的作用范围了(因为就是Project级别的嘛),取而代之的是让你选择作用的模块:

当然喽,你也可以一个都不选(点击cancle),那么该jar只是被创建了,而不作用于任何module模块。

  • ❝说明:对于一个多模块的Project来讲,建议项目使用的所有Jar都放在这里统一管理,模块要使用时直接按需choose就成,而不需要自己再单独add,方便统一管理❞

Facets页情况

Facets可理解为用于配置Project项目的框架区,它能看到项目的每个Module模块使用的框架、语言等情况,并且还可以对它们进行配置。

比如Spring框架,如果某个模块使用了它就可以来这里统一配置。优点是你会发现借助IDEA强大的功能它都给你想好了哪些地方可配置,你可以更改,让你实现配置界面化。除了Spring,其它框架如Hibernate也是如此~

目前支持的Facets(语言/框架)类型有:

模块对应的Facets IDEA会自动Detection探测,若没有你也可以手动添加。

为了更形象的描述此tab页的作用,这里搬一个我自己生产项目来看看实际效果:

说明:不同的Facet对应的最右端窗口内容配置项是不一样的。

通过此视窗,可以看到你当前Project项目,哪些模块使用了Spring框架,哪些是web项目,一目了然。它有个非常大的作用就是站在Project的视角对每个模块进行整体把控,比如若你发现有个模块不需要是web项目(并不需要对外提供服务接口),那铁定就是多引包了或者职责不清晰导致的,就可立马针对性解决,消除隐患。

在实际工作中我自己比较频繁的使用这个功能,用于对模块性质的定位,比如如果是普通模块,绝对不允许是web工程,如果不需要依赖Spring绝对不允许成为Spring工程。因为严格控制Jar包依赖、工程性质是应对大型项目的有效手段。

当然喽,Facets还有个作用是让IDEA编译器认识你的模块,比如如果你是个web模块,若没有在Facets里体现出来,那IDEA就不认识你,就无法给你提供web的一些便捷操作了。

Artifacts页情况

IDEA如何打Jar包?如何打War包? 

在Maven大行其道的今天,虽然用IDEA打包很少使用了,但是有些时候它对你本地调试还是蛮有用的,并且对理解maven的打包依旧有效,来,了解一下。

Artifacts这个概念不是特别好理解,artifact是maven里的一个概念,被IDEA借鉴过来。表示某个模块要何种打包形式,如jar、war exploded、war、ear等等。Artifact是一个项目资源的组合体,整合编译后的 java 文件,资源文件等。有不同的整合方式,比如jar、war、war exploded等等,对于一个module而言,有了Artifact就可以部署了,类似于maven的package打包。

  • ❝说明:war 和 war exploded区别就是后者不压缩,开发时选后者便于实时看到修改文件后的效果❞

来个栗子,这里演示下将hello模块打包成一个Jar:

配置好后,只需顶部菜单栏Build -> Build Artifacts,就可以打出这个Jar包:

执行完此命令后,在Output Directory里就能看到hello.jar这个打包好的文件啦。然后java -jar .\hello.jar就能运行喽(因为咱们打的是可执行Jar包)。关于使用IDEA打包还包括打可执行jar包、Fatjar、包外引用jar包等等,这里就不展开了,后面会放在单独文章里把各种方式汇总在一起聊聊。

总的来说,无论配置Facets还是Artifacts,都是Intellij IDEA要求我们来做的(虽然有些可自动识别),目的是以便其能识别这些文件并整合各插件实现功能(如自动化配置、自动打包),一切为了编码体验和编码效率。

模块如何依赖其它Module

一个中大型项目一般有多个模块,它们各司其职。模块与模块之间一般都存在依赖关系,比如常见的xxx-core模块一般会被其它几乎所有模块所依赖。模块依赖外部库Library知道怎么搞了,那么如何增加本项目的模块依赖呢

 

posted @ 2022-12-13 16:41  hanease  阅读(4341)  评论(0编辑  收藏  举报