燕王起兵后,为了说明自己行动的正义性,他援引朱元璋在《祖训》中“朝无正臣,内有奸逆,必举兵诛讨,以清君侧”的训示作为理由,宣称皇帝被齐泰、黄子澄等奸臣所包围蒙蔽,变乱祖宗法制,已不能依自己的自由意志行使职权。对这些奸恶分子,须加诛讨。他自称举兵为“靖难”,即安靖内部灾难。所以历史上称这一场朱家王室内部的夺权斗争为“靖难之役”。此时,离朱元璋离开人世才15个月,靖难口头上的对象是建文帝身边以齐泰、黄子澄为代表主张削藩的大臣,即所谓“君侧”。但双方心里都雪亮,无非是夺位与保位之争。
建文帝闻报燕王造反,兴兵南下,赶忙调集重兵阻挡。没想到败报频传,北军连破通州、蓟州、遵化、怀来、居庸关等地。建文帝这才不得不调动精锐之师平叛,南北大战也就正式拉开战局。
建文帝任命耿炳文作“征虏大将军”,率领三十万大军北上。八月壬戌日,先头部队十三万人与燕军在滹沱河地区遭遇,战败,退守真定城(正定)。燕王攻了三天,没有攻下,撤兵而去。
耿炳文在当时是硕果仅存的宿将,年已六十五岁。他少年时代替朱元璋守(浙江)长兴,守了十年,和张士诚的兵对垒,大小数十战,战无不胜,其后参加北伐西征,屡克名城,积功受封为长兴侯。这一次虽然战败,但仍然守住了真定,保存了十万左右的兵力。
迂腐的黄子澄惊慌失措,请建文帝临阵换将,改派李文忠的儿子李景隆为征虏大将军,到真定替代耿炳文。但李景隆虽为将门之子,却是十足的纨子弟,哪里比得上耿炳文呢!
李景隆坐误戎机,浪费了不少时间去征调各地的兵力,想凑足五十万,甚至六十万人。打仗的事,何尝是比人多?这一点,不是李景隆这样的人所能想象的。
李景隆收集耿炳文的残兵败将,并征调各路军马,进驻河间。当时,辽东军攻永平,燕王和诸将计议说:“我在这里,李九江(李景隆)不敢来。现在我率军去援救永平,他一定前来攻城。我再回师击之,届时坚城在前,大军在后,李九江必定大败。”诸将都认为北平守兵太少,不好办。燕王说:“城中之众,以战则不足,以守则有余。我此去不是专为救永平,还要诱九江来就擒,是一举而两得。”于是,在九月率军赴援永平,临行告诫留守北平的世子朱高炽说:“李景隆来,只宜坚守,不能出战。”又故意撤卢沟桥守兵,诱李景隆深入。
李景隆果然落入燕王的圈套。他听说燕王率师救永平,就于十月驱兵直趋北平。过卢沟桥时见无军队守卫,喜不自胜,说:“不守此桥,我看他是无能为力了。”以为北平唾手可得,遂进逼北平城下。朱高炽严密部署,拼死守卫。李景隆号令不严,指挥不当,军队虽多,面对坚城,却无可奈何。南军中唯有都督瞿能勇敢善战,他与两个儿子率领精骑千余,杀入张掖门,锐不可当。但是,后援不至,只好勒兵以待。李景隆怕瞿能得了头功,派人阻止,要他等候大军全到,一起进攻。燕军因此得到喘息的机会,连夜汲水泼到城墙上,天寒结冰,第二天,南军无法攀城攻击。
燕王打退攻打永平的辽东军后,又挥军攻破大宁(今内蒙宁城西),挟持宁王朱权回北平,收编宁王的精锐部队八万人,其中尤以朵颜三卫的蒙古骑兵最为骁勇,因此,燕王兵力更加强盛。北平在燕王世子朱高炽的奋勇守卫下,固若金汤,李景隆无法攻克,双方僵持不下。待至燕王回师救援时,内外夹攻,南军支持不住,李景隆率先逃遁,连夜奔回德州。南军见主帅已逃,也纷纷丢弃兵械粮草,落荒而逃。
到了建文二年二月,李景隆又上了燕王一次大当。燕王故意到山西去攻大同,骗李景隆去救,李景隆去了,燕王就撤了兵。李景隆的兵,多半是南方人,空跑了大同一趟,冻死的与冻伤的极多,剩下的也疲惫不堪了。
四月,燕军与李军在涿州的白沟河交战,战了两天,李景隆又遭惨败,退到德州,守不住德州,后又只得丢掉了一百万石左右的军粮,再退,退到济南,燕王率军穷追不舍。这时李景隆尚有十多万兵,仓猝出战,布阵未定,被燕王亲自率领的精骑一冲击,又复大败。李景隆单骑落荒而逃。建文帝见李景隆一败再败,就免去他的大将军职务,以左都督盛庸来接替他。李景隆回到朝中,许多人异常愤慨,揪着他在建文帝面前哭诉说:“景隆出师观望,内怀二心,不把他杀掉,怎么对得起祖宗,怎能激励将士?”但是建文帝毫无问罪之意,李景隆也就安然无事。济南在盛庸和山东布政使铁铉的奋力防守下,被保住了。燕王把军队撤回北平,暂作休整。
盛庸在十二月大胜燕军于东昌(山东聊城),斩燕王的第一号勇将张玉。次年(建文三年)三月,盛庸再战燕军于保定的夹河,大胜。燕王亲自以十几名骑兵断后,盛庸不敢杀他,原因是建文帝有旨,不许“使朕负杀叔父之名”。接着,两军又展开大战,盛军惨遭失败,退回德州。
两个月以后,叛将李远带了若干骑兵,冒充盛军,穿过山东,在江苏沛县放火烧掉盛军在运河的粮船。七月间忠于朝廷的平安(姓平名安)率领一万名骑兵,由真定乘虚直捣北平,在距离北平五十里的平村,与燕将刘江交战,不幸战败,退回真定。大同的守将房昭,带兵进入紫荆关,屯扎在易州水西寨,也在九月间被燕王攻破。辽东守将杨文,进入山海关,围攻永平,被刘江赶走。
至此时为止,燕王虽然胜多败少,但所得的城池仅永平、大宁、保定等地,其他的都是得而复失,不能巩固,将士也战死了好几万人。而南军人数众多,分布各处要地。马皇后面对这种形势,燕王不禁叹息道:“频年用兵,何时可止?要么就临江决一死战,不再返顾北面。”正当燕王为局势怅叹之时,偏偏有若干奉使在外的宦官,因招摇纳贿而被建文帝下旨逮捕,他们逃到北平,向燕王投降,把京师与南方各省的空虚情形向燕王报告,于是燕王便在建文四年率军大举南下。
燕王避实就虚,不攻盛庸所守的德州与铁铉所守的济南,而经由东阿、东平、汶上、兖州、沛县,直向徐州。盛庸撤军,退守淮河。南军大将平安在燕王的后面追踪,于四月间追到(安徽)灵璧县西南的齐眉山,先胜后败,被掳。五月,燕兵渡淮,盛庸战败;六月,战于浦子口,又败。盛庸改守长江,都督佥事陈瑄带了江上的水军降燕,盛庸在高资港作最后一次抵抗,仍一败涂地。建文帝见燕军锐不可当,忙派人议和,燕王根本不予理睬,驱兵直逼南京城下。当时燕王的弟弟谷王与李景隆负责守金川门,燕兵一到,就开门迎降,京师告破。
燕兵进京后,宫中起火,建文帝不知去向。朱棣立即下令紧闭宫门、城门,大搜数日,务须生要见其人,死要见其尸。但连搜多日,毫无结果。宫中盛传建文帝和马皇后死于大火之中,朱棣命将骨灰捡出,“用天子礼”葬之。
燕王攻入南京之后不久,在群臣的拥戴下登上皇帝位,宣布以明年为永乐元年,他就是明朝历史上的成祖皇帝。前后三年之久的皇族内部争夺帝位的战争,终于以朱棣的胜利而告结束。