元世祖忽必烈一心想開疆拓土并開創遠邁漢唐之偉業,卻在向彈丸島國日本屢屢遣使要求朝貢后一再得不到回應。日本的態度徹底激怒了忽必烈,但就在他下定征伐日本的決心時高麗卻發生了激烈的反蒙斗爭——三別抄起義。起義軍占據著高麗南部海島,這是忽必烈東征日本的必經之地。早在公元1271年三別抄為爭取援助甚至給日本寫過求援信,但無論是京都朝廷還是鎌倉幕府都不愿意引火燒身。
三別抄一方面是抗蒙勢力,另一方面也是反抗親蒙古的高麗政府的軍事力量:公元1273年4月元朝駐高麗統帥忻都、洪荼丘與高麗將軍金方慶聯手將反抗力量成功鎮壓,從而控制了通向日本的海道。就在兩個月前經過六年的圍城戰,元軍攻陷南宋重鎮襄陽,元朝在濟州島設立招討司,將之納入中央政府的直接管轄之下。6月忻都、洪荼丘、金方慶凱旋高麗首都開京,而忻都則馬不停蹄回到大都復命。7月洪荼丘、金方慶也被召至大都。東征日本的具體事宜已開始籌備。
公元1274年正月金方慶回到高麗向國王傳達了忽必烈的命令:造艦九百艘,其中大艦可載千石或四千石者三百艘,由金方慶負責建造;輕疾舟(快速艦)三百艘、汲水小船三百艘由洪荼丘負責并限定于1月15日動工,限期完工。同年高麗國王駕崩,世子即位,忽必烈把自己的公主嫁給了這位世子并將其扶植為高麗的新國王。這位新上任的高麗國王同時也是元朝駙馬自然不敢怠慢自己那位強有力的岳父大人:很快他就征集工匠責令限期造出所需船只。由于大量征召工匠影響到農事,一時間高麗國內怨聲載道。國王擔心引發民變,請求每船留五十人,其余放歸鄉里務農。工匠數量減少,但完工期限并沒變更,為了趕工期高麗工匠們不得不偷工減料,東征日本的戰役尚未打響就因此蒙上了一層陰影。
6月九百艘軍艦如期完工。忽必烈遂任命征東都元帥忻都、右副帥洪荼丘、左副帥劉復亨統帥蒙漢軍兩萬人、高麗軍五千六百人,加上高麗水手六千七百人,共計近四萬人,從高麗南部港口出發直指日本。時值公元1274年,這年是元朝至元十一年、日本文永十一年,所以日本史書稱這場戰爭為「文永之役」。元軍的核心部隊是蒙古軍團——他們軍紀嚴整:每十人、百人、千人、萬人各為一個戰斗方隊。此外元朝的火器技術在當時處于世界領先水平,威震歐亞大陸。
公元1274年10月5日清晨對馬島的八幡神宮突然遭遇火災,被人們視為不祥之兆。到了這天下午五時左右不詳的預感成為了事實:兩天前從高麗出發的元朝四萬大軍搭乘九百余艘戰艦出現在對馬島海域。一直對蒙古入侵保持警惕的對馬守護允宗助國父子立即帶領八十騎兵星夜馳往組織抵抗。允宗助國在次日早晨派通曉日、漢雙語的使者前往元軍陣營打探元軍來意,但旋即被斬殺。隨后雙方展開激戰,但由于眾寡懸殊,允宗助國及其嫡子、養子共十二人戰死,對馬守護軍被全殲,幾小時后元軍順利攻占整個對馬島。之后元軍一方面布兵占領對馬島,一方面派出軍艦在其近海尋殲日軍,兵鋒指向壹岐。
允宗助國的部下小太郎和兵衛次兩人僥倖逃出對馬,把元軍來襲的消息傳到博多。10月14日下午元軍數百人從壹岐西岸成功登陸。壹岐守護代平景隆率百余騎抵御。盡管壹岐方面在得知對馬的情況后加強了兵力部署,但依然和元軍不是一個量級:蒙古人作為馬背上的民族,其箭弩的有效射程超過兩百米,而日本方面卻做不到。而蒙古的火器更是日軍見所未見聞所未聞的神兵利器。日軍借助自己本土作戰對地形的熟悉和元軍周旋了一天,終于在次日徹底戰敗,平景隆以自殺方式結束了自己的抵抗。僥倖逃出的壹岐守軍也馳往博多報告戰敗的消息。
16日元軍逼近肥前沿海島嶼及西北沿海一帶。肥前是日本九州西南沿海地區的古地名,包括如今的長崎和佐賀兩縣。蒙古軍輕取對馬、壹岐兩地后于10月20日部分高麗部隊在日本九州登陸,元軍主力并沒在肥前登陸向縱深發展,而是經由海路向博多灣方向前行。九州大宰府守護所成為元軍新的進攻目標。此前大宰府西守護所少貳兼任「三前二島」守護藤原經資先后接到元軍進攻對馬、壹岐的戰報并將戰報向鎌倉幕府進行了報告。戰報于17日送達鎌倉幕府,18日到達京都朝廷。
20日清晨元軍主力在九州博多灣登陸,此時日本方面已在該地聚集了總計十萬兩千人的海岸防衛部隊。按說元軍總兵力滿打滿算才四萬人左右,其中還有相當部分是充當水手和后勤人員,再加上在對馬、壹岐兩地的戰損,另外日軍是本土作戰熟悉地形,看起來元軍要戰勝十萬多日軍委實不易。然而接下來發生的事讓人瞬間有穿越的趕腳:前一晚已在此布陣的五百日軍先頭部隊并沒趁元軍登陸時進行半途截擊,而是學起了中國的宋襄公——等著元軍列好陣形后射出鳴鏑向對方宣告:戰斗開始。元軍的答覆是直接開炮,從未見識過大炮的日軍瞬間被元軍的炮火徹底打亂了陣形。
除了武器裝備上的差距外,雙方的指揮系統也有天壤之別:日本武士軍團是以「守」、「地頭」為單位臨時構建而成——「守」和「地頭」率領自家族人、武士自成一個小的戰斗單位,也就是說日本武士長期以來只適應島國內部各家武士集團之間的互毆,根本沒見識過橫掃歐亞大陸的蒙古軍團的集群沖鋒,在戰斗過程中各家武士以自家主公為核心各自為戰,缺乏統一的系統指揮。這種戰斗模式不僅對日本武士而言是陌生的,對他們的戰馬而言也是陌生的:日本是島國,畜牧業遠遠不及蒙古發達,相對矮小的日本馬在見到蒙古馬和元軍的炮火時就產生了恐懼心理,往往還沒進入實質性對抗階段就在己方陣地驚躍狂奔。
元軍和兵力上呈優勢的日軍激戰一整天后終于在傍晚時分迫使日軍全面撤退,但元軍并不打算輕易放過日軍——元軍左副帥劉復亨從高坡上驅馬而下準備親自參戰。然而恰恰就是他這一舉動瞬間改變了戰局——日軍前線指揮藤原經資敏銳地發現了這個細節,于是立即引弓搭箭將劉復亨射落馬下。此時天色已暗,損失慘重的日軍退守工事內部,不熟悉地形的元軍也擔心貿然闖入會被日軍伏擊,于是停止進攻轉而和日軍相持對峙。日軍見元軍攻勢暫緩,于是利用自己對地形的熟悉不斷派出小股部隊進行夜襲騷擾,慣于集群沖鋒的元軍對這種騷擾式戰術不勝其煩,于是一到夜間就撤回艦上。
撤回艦上的元軍在統帥忻都主持下召開會議商討下一步的軍事部署:此時元軍自身傷亡也不少、箭矢也幾乎殆盡、重要將領負傷,盡管在白天的戰斗中他們完全壓制了日軍,但日軍的兵力仍是他們的數倍,這不能不令忻都對是否擴大攻勢猶豫不定。參與會議的高麗將領金方慶相對比較冷靜——他認為只要堅持苦戰便能攻克大宰府,只要保住了既定戰果就可以等待援軍從長計議。
然而當第二天的太陽升起之時忱戈待旦的日軍列好陣勢久等元軍來攻卻遲遲不見元軍蹤影,于是派人探察元軍虛實卻意味發現:海面上已再無元軍戰艦的蹤影。日軍匪夷所思了:這仗究竟打贏了,還是打敗了?完全就是莫名其妙一頭霧水。關于元軍失蹤的原因主要有兩種說法:其一是認為元軍遭遇風暴,損失慘重,為保全力量不得不撤退;其二是說忻都在權衡利弊后主動作出撤兵決定。
受到前線戰報的鎌倉幕府和京都朝廷一開始也都大吃一驚,不過他們很快就大肆宣揚:這是一次偉大的勝利,盡管他們自己都不確定自己是不是真打勝了。其實大肆宣揚勝利只不過是為了安撫人心而故作鎮靜,事實上此時作為日本實際統治者的北條時宗已經預感到:蒙古極有可能再次來襲。作為應對之策:他組織民夫在博多灣增建堅固的石壩以加強防務——石壩東起箱崎,西到今津,高五尺許,寬一丈,蜿蜒長達數十公里,整個石壩的修筑歷時五年,于公元1280年完工。同時他對西部的防務工作也進行了細致分工。他甚至在1275年末制訂過一個「異國征伐計劃」——打算主動出擊高麗。
客觀而言:忽必烈這次派往日本的軍隊無論從規模上還是實力上都不足以徹底征服日本——這有可能是忽必烈低估了日本的抵抗能力,可能是在進行征伐南宋的戰爭的同時派遣元軍的主要目的不過是進行戰爭恐嚇,促使日本迅速遣使通好。