Maneira correta de instalar dependência virtual

6

Estou no processo de criar um pacote .deb de nosso aplicativo baseado em Java (consulte esta pergunta de superusuário ). Agora estou usando as seguintes informações de dependência:

Depends: java-runtime-headless (>= 1.6)
Recommends: openjdk-7-jre-headless, ...

Agora estou tentando instalá-lo:

$ sudo dpkg -i MYAPP.deb 
Selecting previously unselected package MYAPP.
(Reading database ... 140874 files and directories currently installed.)
Unpacking MYAPP (from MYAPP.deb) ...
dpkg: dependency problems prevent configuration of MYAPP:
 MYAPP depends on java-runtime-headless (>= 1.6); however:
  Package java-runtime-headless is not installed.
dpkg: error processing MYAPP (--install):
 dependency problems - leaving unconfigured
Processing triggers for desktop-file-utils ...
Processing triggers for bamfdaemon ...
Rebuilding /usr/share/applications/bamf.index...
Processing triggers for gnome-menus ...
Errors were encountered while processing:
 MYAPP
$

OK, estou tentando instalar a dependência:

$ sudo apt-get install java-runtime-headless
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package java-runtime-headless is a virtual package provided by:
  openjdk-7-jre-headless 7u25-2.3.10-1ubuntu0.12.04.2
  openjdk-6-jre-headless 6b27-1.12.6-1ubuntu0.12.04.2
  gcj-jre-headless 4:4.6.3-1ubuntu5
  gcj-4.6-jre-headless 4.6.3-1ubuntu2
  default-jre-headless 1:1.6-43ubuntu2
You should explicitly select one to install.

E: Package 'java-runtime-headless' has no installation candidate

OK, eu escolhi um desses pacotes:

$ sudo apt-get install openjdk-7-jre-headless
Reading package lists... Done
Building dependency tree       
Reading state information... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
 openjdk-7-jre-headless : Depends: openjdk-7-jre-lib (= 7u25-2.3.10-1ubuntu0.12.04.2) but it is not going to be installed
                          Depends: ca-certificates-java but it is not going to be installed
                          Depends: tzdata-java (>= 2012e-0ubuntu0.12.04.1) but it is not going to be installed
                          Depends: java-common (>= 0.28) but it is not going to be installed
                          Depends: libnss3-1d (>= 3.12.9+ckbi-1.82-0ubuntu4) but it is not going to be installed
                          Recommends: icedtea-7-jre-jamvm (= 7u25-2.3.10-1ubuntu0.12.04.2) but it is not going to be installed
 MYAPP : Depends: java-runtime-headless (>= 1.6)
         Recommends: mercurial but it is not going to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

Agora, apenas sugere que eu remova meu aplicativo:

$ sudo apt-get -f install
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Correcting dependencies... Done
The following packages will be REMOVED:
  MYAPP
0 upgraded, 0 newly installed, 1 to remove and 3 not upgraded.
1 not fully installed or removed.
After this operation, 41.0 MB disk space will be freed.
Do you want to continue [Y/n]? n
Abort.
$ 

Parece que eu primeiro preciso instalar a dependência ( openjdk-7-jre-headless ) e, em seguida, meu aplicativo. Como um usuário normal deve entender isso? Ou existe uma maneira melhor de instalar MYAPP.deb ?

    
por Thomas S. 26.07.2013 / 13:13

3 respostas

5

Eu removeria a versão da sua dependência de "java-runtime-headless".

  

Pacotes virtuais sofrem de algumas limitações preocupantes, as mais   sendo significativa a ausência do número da versão.

link

  

Se você quiser especificar qual de um conjunto de pacotes reais deve ser o   padrão para satisfazer uma dependência específica de um pacote virtual,   deve listar o pacote real como uma alternativa antes do virtual.

link

    
por NGRhodes 18.10.2013 / 16:14
2

Então, por que você cancelou a execução de sudo apt-get -f install . Execute-o novamente e não o aborte.

Depois de executar estes comandos:

sudo apt-get clean
sudo apt-get autoclean
sudo dpkg --configure -a

Em seguida, execute novamente:

sudo apt-get -f install

Se a saída for algo como:

0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded

execute:

sudo apt-get -u dist-upgrade

Veja Como resolvo dependências não satisfeitas depois de adicionar um PPA? mais sobre.

Agora instale java-runtime-headless usando o seguinte comando:

sudo apt-get install openjdk-7-jre-headless

E, finalmente, instale seu aplicativo:

sudo dpkg -i MYAPP.deb 
    
por Radu Rădeanu 19.10.2013 / 15:19
2

Como NGRhodes sugeriu que eu alterasse as dependências para

Depends: openjdk-7-jre-headless | java-runtime-headless, ...
Recommends: ...

Agora posso instalá-lo com

$ sudo dpkg -i MYAPP.deb

e instale as dependências ausentes com

$ sudo apt-get -f install
    
por Thomas S. 22.10.2013 / 16:20