Diferença dessas dependencias JSF

estou com duvida sobre essas dependencias, é a mesma coisa?

Essa

      <dependency>
		<groupId>org.glassfish</groupId>
		<artifactId>javax.faces</artifactId>
		<version>2.2.14</version>
		<scope>compile</scope>
	</dependency>

Para Essas
	<!-- https://mvnrepository.com/artifact/com.sun.faces/jsf-api -->
		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-api</artifactId>
			<version>2.2.14</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/com.sun.faces/jsf-impl -->
		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-impl</artifactId>
			<version>2.2.14</version>
		</dependency>

Como JSF é uma especificação, você só precisa da primeira ou da segunda, mas não da terceira. Você só vai precisar da API para compilar o teu código. A implementação não é necessária, pois ela já está presente no container de aplicação (Wildfly ou glassfish, por exemplo). Quando você fizer deploy e tua aplicação for rodar no container, a implementação vai estar automagicamente no classpath e tudo funciona.

humm… No caso do Tomcat, tenho que colocar a implementação e a dependencia coreto?

Uma duvida e dessa forma:

Pelo que entendi, ele paga a ultima versão da dependencia e em uma tag eu informo qual versão quero usar?

<!-- Omnifaces -->
		<omnifaces.version>2.1</omnifaces.version>

<dependencies>
		<dependency>
		    <groupId>org.omnifaces</groupId>
		    <artifactId>omnifaces</artifactId>
		    <version>${omnifaces.version}</version>
		    <scope>compile</scope>
		</dependency>

Como o Tomcat é um Servlet Container, ele não tem uma implementação do JSF. O que eu falei não vale pro Tomcat, você precisa colocar a implementação junto nesse caso.

Não sei se tem como você fazer um deploy separado da implementação do JSF, ou tem que coloca-la dentro do teu war mesmo.

beleza! valeu pela dica.

Isso daí é outra coisa. As vezes você declara várias dependências de bibliotecas de um mesmo “fabricante”.

Por exemplo, suponhamos que o GUJ tem um conjunto de bibliotecas para web services. Imagine que são 6 bibliotecas. No teu pom, você vai colocar a dependência para cada uma delas, juntamente com a versão. Como elas são desenvolvidas em conjunto, a versão delas sempre é igual. Estamos agora, por exemplo, na versão 1.1. Você vai lá e declara todas as dependências, e coloca a versão 1.1 em cada uma delas. De um dia para o outro, sai uma versão 5.0 totalmente revolucionária e você quer atualizar o teu pom. Ao invés de ter que sair editando cada versão de cada dependência, você pode declarar variáveis (tipo <guj.version>5.0</guj.version>) e só referenciar essa variável dentro das dependências. É pra isso que serve aquele ${variavel}. Também serve para organizar melhor o pom.