Ubuntu – Why does apt think it needs this extra dependency

aptpackage-management

I'm working on some machine setup instructions, and I was surprised to find out that apt-get install A B can behave differently than apt-get install A && apt-get install B.

My specific example is A == openjdk-7-jdk and B == ant.

So, openjdk-7-jdk depends on openjdk-7-jre-headless, which satisfies ant's dependency java6-runtime-headless. But if you install them as apt-get install openjdk-7-jdk ant, APT doesn't seem to figure this out and installs default-jre-headless. But if you install openjdk-7-jdk prior to installing ant, its dependency is satisfied and all is good.

APT is usually smart enough to figure this sort of thing out, so why can't it do so in this case? I'd like to have a better understanding as to why it works this way, so this sort of thing doesn't trip me up again in the future.

Best Answer

Seems that there is some kind of "weight" system playing here:

$ aptitude why ant openjdk-7-jdk
p   ant                 Recommends ant-optional       
p   ant-optional        Suggests   libgnumail-java    
p   libgnumail-java     Suggests   libgnumail-java-doc
p   libgnumail-java-doc Recommends default-jdk-doc    
p   default-jdk-doc     Depends    openjdk-7-doc      
p   openjdk-7-doc       Suggests   openjdk-7-jdk

As you can see ant depends of openjdk-7-jdk due a complicated and intricated amounts of suggestions, recommendations and dependency, while when using openjdk-6-jdk the dependency is more direct:

$ aptitude why ant openjdk-6-jdk
p   ant           Suggests default-jdk | java-compiler | java-sdk
p   openjdk-6-jdk Provides java-sdk

Of course aptitude methods of dependency resolution, could be different of apt-get's. BTW, running a simulation of ant without openjdk-7-jdk installed don't pulled openjdk-6-jdk:

$ sudo apt-get install ant
[sudo] password for braiam: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  ant-optional
Suggested packages:
  default-jdk java-compiler java-sdk ant-gcj ant-doc liboro-java junit
  libregexp-java jython antlr libbcel-java libjdepend-java libgnumail-java
  libcommons-net-java libjsch-java javacc ant-optional-gcj
The following NEW packages will be installed:
  ant ant-optional
0 upgraded, 2 newly installed, 0 to remove and 9 not upgraded.
Need to get 2,234 kB of archives.
After this operation, 3,041 kB of additional disk space will be used.
Do you want to continue [Y/n]? 

Maybe if you use the same methods as I did, you could figure out more, since I'm using Debian testing right now and repositories could have changed in the meanwhile.