Eight people received minor injuries in the accident, which took place shortly after 4:00 am (0300 GMT) in a busy waterway in the Hjeltefjord near Bergen, Norway's military said.
The 137 people on board the KNM Helge Ingstad frigate, which was returning from Nato's Trident Juncture exercises, were evacuated after the collision with the Sola TS tanker, the military said.
“The KNM Helge Ingstad suffered damage above and below the waterline. The damage was such that the frigate was no longer stable and was not able to float sufficiently,” a Norwegian Navy officer, Sigurd Smith, told reporters.
“It was therefore decided to force it up on (nearby) rocks,” he said.
In the early afternoon, the grey 5,000-tonne vessel was listing heavily on its side, its helicopter landing pad at the back of the ship lying largely under the water, television images showed.
“It took on a lot of water and there is a real danger that it will sink where it is,” an official for the Sola rescue centre told AFP.
The Navy fears that the frigate will slip off the rocks and sink, with tugboats trying to keep it in place under the watchful eye of several Navy vessels.
“We're trying to stabilise the ship on the rocks” in the hopes of refloating it, Navy Admiral Nils Andreas Stensones said.
“According to our assessments, there's no reason to believe that anything, like an accident, could happen with the weapons” on board, he said.
The cause of the accident was not yet determined, the Navy said.
Meanwhile, the 62,000-tonne oil tanker, which was flying the Maltese flag but is owned by a Greek shipping company, was only slightly damaged and none of the 23 people on board were injured, the rescue centre said.
No leak from that vessel was reported.
A nearby oil terminal where the Maltese vessel had just loaded its cargo was closed to traffic on Monday, in turn leading to a halt in production at five oil fields in the North Sea, according to business daily Dagens Naeringsliv.
Norway is the biggest oil producer in Western Europe.
The country's coast guard said meanwhile it had detected small diesel spills in the water and it was trying to contain further pollution.
An anti-pollution ring was thrown up near the frigate to contain spills.
Norway's Accident Investigation Board, which has opened an inquiry, had initially said a tugboat had also been involved in the collision but the Navy later denied that.
Built in Spain in 2009, the KNM Helge Ingstad participated in chemical disarmament operations in Syria between December 2013 and May 2014.