Por que meu projeto JSF dá o erro "Cannot find component for expression msg referenced" no commandButton do Primefaces?

Estou fazendo um projeto JSF, mas quando fiz esse formulário abaixo, deu erro:

<h:form>
    <p:panelGrid columns="2">
        <h:outputLabel for="nome" value="Nome"></h:outputLabel>
        <p:inputText id="nome"></p:inputText>
        <h:outputLabel for="sobrenome" value="Sobrenome"></h:outputLabel>
        <p:inputText id="sobrenome"></p:inputText>
        <p:button value="Enviar"></p:button>
    </p:panelGrid>
</h:form>

Na página index.xhtml dá o seguinte aviso:

Cannot find component for expression “msg” referenced from “j_idt8”.

E a seguinte exceção:

exceção-primefaces.txt (4,1,KB)

Meu web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.jsf</welcome-file>
    </welcome-file-list>
</web-app>

Minha classe:

package beans;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@SessionScoped
@ManagedBean
public class NomesBean {
    private String nome;
    private String sobrenome;
    private String mensagem;
    
    public void dizerOla() {
        mensagem = "Olá, " + nome + " " + sobrenome;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getSobrenome() {
        return sobrenome;
    }

    public void setSobrenome(String sobrenome) {
        this.sobrenome = sobrenome;
    }

    public String getMensagem() {
        return mensagem;
    }

    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }
}

Estou com o Apache 9 (o 10 deu erro por usar pacotes jakarta ao invés de javax), Netbeans 15, JDK 11.0.16.1.

Os jars incluídos são:

jsf-api-2.1.9
jsf-impl-2.1.9
primefaces-10.0.0