Maine was born in Fredericksburg, Virginia. After graduating from North Stafford High School in Stafford, Virginia, Maine played college baseball for UNC Charlotte, where he was named the Conference USA Pitcher of the Year in 2001 and set several single-season 49ers' records, including strikeouts and wins. In 2000, while still in college, Maine pitched for the Bethesda Big Train, a summer collegiate baseball team located a few miles outside of Washington D.C.
Maine decided to forgo his senior season at Charlotte and was drafted by the Baltimore Orioles in the sixth round of the 2002 Major League Baseball Draft. In 2003, he emerged as one of the top prospects in the minor leagues when he led all minor league pitchers in strikeouts with 185. He made his debut with the Orioles on July 23, 2004. After spending the latter half of 2004 and most of 2005 shuffling between Baltimore and Triple-A Ottawa, Maine recorded his first Major League win on August 13, 2005, at Camden Yards with a 1–0 shutout victory over the Toronto Blue Jays in which he started and pitched five innings.
Maine was traded to the Mets on January 21, 2006, along with right-handed reliever Jorge Julio in exchange for starting pitcher Kris Benson.
He was called up from Triple A Norfolk in early May 2006 after rookie Brian Bannister was put on the disabled list with a hamstring injury. Maine started on 2 May against the Washington Nationals and took the loss after giving up four runs on six hits and two walks in 5.1 innings. He was placed on the disabled list on 6 May with inflammation of his right middle finger, which he says hurt his 2 May start. He was reactivated on June 12 and was optioned back to Triple A Norfolk.
On July 3, he was recalled from the minors and became part of the Mets' starting rotation. After a solid, if mediocre start off the DL, Maine had a start that could be said to have turned around his career. With Orlando Hernandez originally slated to start against the Houston Astros, early rain caused the Mets to put in Maine instead. He pitched a complete game shutout. That start continued a scoreless innings streak. Maine pitched a scoreless inning in relief, and then 22 scoreless innings over three starts, recording two wins and a no decision over that span. After his second scoreless outing, Mets manager Willie Randolph designated Maine as the rotation's fifth starter over higher-ranking prospect Mike Pelfrey.
Maine's scoreless-inning streak reached 26 innings before he allowed a run. Against Washington on August 12, Maine retired 11 of the first 12 batters he faced before Nick Johnson hit a solo home run. The streak fell 5 2⁄3 innings short of Jerry Koosman's Mets franchise record. His streak was the longest ever by a Mets rookie starter, exceeding Dwight Gooden and Anthony Young's 23-inning streaks by two. His 25 scoreless innings by a starter was the longest streak since Al Leiter threw 25 1⁄3 scoreless in 1998.
On September 29, 2006, in his final at-bat of the season, Maine recorded his first major league hit, ending a streak of twenty-eight hitless at-bats.
Overall, Maine went 6–5 with a 3.60 earned run average in 15 starts in his debut season for the Mets, showing flashes of dominance, such as his scoreless innings streak. His efforts helped the Mets win the National League Eastern Division. Despite his solid season, he was originally not expected to make a start in the postseason. However, after injuries sidelined both Pedro Martínez and Orlando Hernández, Maine found himself starting Game 1 of the National League Division Series for the Mets. In that game, he pitched 4 1⁄3 innings and got a no-decision. The Mets went on to win that game to give them a 1–0 lead in the Division series against the Dodgers. In the must win Game 6 of the National League Championship Series against the St. Louis Cardinals, Maine pitched 5 1⁄3 shutout innings and defeated defending National League Cy Young Award winner Chris Carpenter to force a Game 7.
Maine went to the 2006 Major League Baseball Japan All-Star Series along with teammates José Reyes and David Wright.
Maine started his 2007 campaign with a win against the Cardinals, holding St. Louis to one hit and no runs in seven innings. Maine's success against hitters in 2007 continued, and he posted a 15–10 record with a 3.91 ERA with 180 strikeouts in 191.0 innings pitched. Maine's off-season conditioning program helped him to pitcher deeper into ballgames, and he started to become one of the more dominant pitchers in the National League.
In April, he had a no-hitter through 6 innings against the Florida Marlins before a single by Miguel Cabrera spoiled the bid. After a solid April in which he went 4–0 with a 1.35 ERA, Maine was named the National League Pitcher of the Month.
At the All-Star break, Maine led Mets starters with a 2.71 ERA, 93 strikeouts and was tied with Brad Penny for the most wins in the NL at 10 each. Despite posting great numbers, he was not in the All-Star game, when asked if he expected to make the game, he said no.
On July 24, 2007, in the bottom of the 4th inning against the Pittsburgh Pirates, Maine hit a 2-run home run to left field and received a curtain call. This was his first home run of his major league career. The Mets won 8–4, and Maine earned his 11th win of the season. Maine earned his Met-leading 12th victory against the Nationals on July 29, pitching a complete game shutout in a five inning rain-shortened game, giving up only a single hit.
As late as September 18, his 7.89 strikeouts per 9 innings pitched put him the top 10 among all qualified National League starting pitchers.
On September 29, 2007, Maine threw 7.2 scoreless innings allowing 1 hit, and striking out 14 Florida Marlins, leading the Mets to a 13–0 rout. Maine's 14 strikeouts were the most for a Mets starter in eight years; the Marlins' lone hit came with two outs in the eighth inning, an infield hit to the third base bag by Marlins' back-up catcher Paul Hoover (baseball). The no-hit bid was nearly a mirror image of April 28, 1992, when David Cone threw 7.1 hitless innings before surrendering an infield hit or that of Dwight Gooden in 1984 when a similar hit was given up and third baseman Ray Knight could not pick it up in time. John Maine has been heralded by Tom Seaver as something of a protégé.
He entered the 2008 season as the Mets' number 3 starter. Maine received a raise by the Mets and earned $450,000. He ended the season with 25 starts, 140 innings, 10–8 win-loss record, and a 4.18 ERA.
The end of Maine's 2008 season was marred by injury. On August 4, Maine was put on the disabled list with a strained rotator cuff. He returned, making three more starts, but was then put back on the disabled list. On September 24, he again came off the disabled list but Manager Jerry Manuel did not allow him to pitch for fear of future injury. At season's end, he underwent surgery in which doctors removed a bone spur from his shoulder. The doctors were amazed at the size of the spur; they said it was the biggest they had ever seen. They were amazed that he was able to pitch in that condition.
He began throwing in December and was ready for spring training of 2009.
In January, the Mets avoided arbitration, signing Maine to a one-year, $2.6 million contract. Maine initially struggled coming off the shoulder surgery, posting a 5.40 ERA to go with a 1–2 record in four April starts. However, he bounced back in his six starts in May, going 4–1 with an ERA of 2.75, nearly half of his April ERA. After a poor start in June, he was placed on the 15-day disabled list due to arm fatigue. Maine would stay on the DL with arm fatigue and numerous setbacks for a long amount of time. He eventually came back in mid-September and was eased back into the rotation, going more than 5 innings only once. In his last start of the season against the Astros, he went 7.0 innings letting up one earned run with 7 strikeouts, with that encouraging start he gave the Mets more certainty that he can return to his '07 form in the 2010 season. He finished the 2009 season with a 7–6 win/loss record throwing 81.1 innings with an era of 4.43.
In January, the Mets and John Maine agreed to arbitration, signing Maine to a one-year, $3.3 million contract (with an additional $225,000 that can be earned in performance bonuses).
Maine struggled with his performance and spent additional time on the Disabled List. On 20 May, in his ninth start of the season, he was taken out of the game after pitching to one batter. Maine stated that he was in good health, but Jerry Manuel ignored his request to stay in the game. Pitching coach Dan Warthen said that Maine had "habit" of not being truthful about his health.
On July 23, Maine had arthroscopic surgery to repair his shoulder and missed the remainder of the 2010 season.
Maine became a free agent after the 2010 season and signed with the Colorado Rockies, starting the 2011 season in the minor leagues.
On February 17, 2011, Maine signed a minor league contract with the Colorado Rockies, including an invitation to Spring Training. On June 22, after pitching 45 innings with the Triple-A Colorado Springs Sky Sox, recording a 7.43 ERA, 35 strikeouts, and 37 walks, Maine left the team and was reportedly considering retiring from baseball.
Maine signed a minor league contract with the Boston Red Sox on January 27, 2012. He also received an invitation to spring training. Maine was released on May 10, 2012.
On May 25, 2012, John Maine signed with the Yankees to a minor-league deal, and assigned him to extended spring training.
Maine was signed to the Scranton-Wilkes Barre Yankees roster on June 12 and made his first appearance in regular season game play in nearly a year that evening. Initially scheduled to start, he instead picked up in the 2nd inning after a spot-start by the rehabbing David Robertson. Throwing 65 pitches (37 for strikes) in three innings of work, he struck out four, walked two, and gave up three runs (two earned) while recording a win for the Yankees.
On December 24, 2012 he signed a minor league contract with the Miami Marlins that contained an invitation to spring training. He made the opening day roster and was designated for assignment on April 19, 2013. He was subsequently released afterwards.
On August 25, 2014, the Charlotte 49ers baseball team announced that Maine would join the staff of his alma mater as a volunteer assistant.