Mengatasi Permasalahan Upgrade Plugin Di Griffon


Pada saat men-coba menginstall plugin Glazed Lists di Griffon, saya mendapatkan pesan kesalahan seperti berikut ini:

C:\projects\latihan>griffon -Dgriffon.artifact.force.upgrade=true install-plugin glazedlists
Welcome to Griffon 1.2.0 - http://griffon-framework.org/
Licensed under Apache Standard License 2.0
...
Some dependencies could not be resolved.
-= INSTALLED =-
. datasource-1.1.0
   . lombok-0.4
. gsql-1.1.1
   . datasource-1.1.0
      . lombok-0.4
. lombok-0.4
. swing-1.2.0
-= MISSING =-
? swing-1.0.0 from griffon-local
Could not resolve plugin dependencies. Review all dependencies marked with ! and
 try again with -Dgriffon.artifact.force.upgrade=true

Masalahnya adalah saya sudah memakai swing-1.2.0 tetapi plugin tersebut masih membutuhkan swing-1.0.0.   Hal ini juga terjadi bila saya men-install plugin lain yang versi dependency-nya tidak sesuai.  Padahal saya  mengira saya bisa memberitahu  Griffon untuk mengabaikan perbedaan versi ini dengan menyertakan parameter griffon.artifact.force.upgrade=true.   Tapi plugin tetap tidak dapat di-install bila tidak terkoneksi ke internet.

Untuk mengatasi permasalahan ini, saya akan mencoba melihat isi kode program Griffon.  Pada saat saya memberikan perintah install-plugin,  kode program yang akan dikerjakan adalah closure yang dirujuk oleh variabel installArtifact di subproyek griffon-scripts di file src\main\groovy\_GriffonArtifacts.groovy.

Karena saya hanya memberikan nama plugin, maka yang selanjutnya dipanggil adalah closure installArtifactForName(). Penelusuran selanjutnya membawa saya ke closure  doInstallArtifact() dan doInstallFromFile().

Saya akhirnya sampai di class ArtifactInstallEngine yang dipakai oleh closure doInstallFromFile().   Method yang akan dipanggil dari class ini adalah method installFromFile().

Saya menemukan bahwa yang menyebabkan kegagalan instalasi plugin saya terletak di bagian berikut ini:

if (resolveDependencies && type == Plugin.TYPE) {
   if (release.dependencies) {
      Map<String, String> plugins = [:]
      for (entry in release.dependencies) {
         plugins[entry.name] = entry.version
      }
      if (!installPlugins(plugins, framework)) {
         throw new InstallArtifactException("Could not install plugin ${releaseName}")
      }
   }
}

Dari kode program di atas, terlihat bahwa method yang akan dipanggil selanjutnya adalah method installPlugins().   Bila saya menelusuri kode program di method installPlugins(), saya akan menemukan bahwa method tersebut akan memanggil method _installPlugins().   Isi dari method _installPlugins() adalah seperti berikut ini:

private boolean _installPlugins(List dependencies, ArtifactDependencyResolver resolver, boolean framework) {
   installedArtifacts.clear()
   uninstalledArtifacts.clear()

   List installPlan = resolveDependenciesFor(dependencies, resolver, framework)
   installPluginsInternal(installPlan, framework)
}

Penyebab kegagalan terletak di method resolveDependenciesFor().   Pada method tersebut, bagian yang menyebabkan pesan kesalahan dicetak adalah:

if (dependencies.grep {!it.resolved}) {
   String installed = installedDependencies.values().collect([]) {printDependencyTree(it, true)}.join('\n')
   String target = dependencies.collect([]) {printDependencyTree(it, true)}.join('\n')
   eventHandler 'StatusError', "Some dependencies could not be resolved.\n-= INSTALLED =-\n${installed}\n-= MISSING =-\n${target}"
   throw new InstallArtifactException('There are unresolved plugin dependencies.')
}

Hal ini terjadi karena ada objek ArtifactDependency dengan nilai resolved berupa false!   Lalu, sebenarnya bagian mana yang men-set nilai resolved menjadi true.   Saya melakukan pencarian di baris-baris sebelum kode program tersebut, dan menemukan jawaban di:

for(ArtifactDependency dep : dependencies) {
   ArtifactDependency installed = installedDependencies[dep.name]
   if (!installed || installed.snapshot || installed.version != dep.version) continue
   dep.installed = true
   dep.resolved = true
   dep.conflicted = false
}

Bagian yang patut dicermati di atas adalah bagian installed.version != dep.version!!   Ini yang menyebabkan kegagalan instalasi plugin.

Saya akan merubah perilaku install-plugin dimana bila nilai griffon.artifact.force.upgrade=true,  maka perbedaan versi dari dependency akan diabaikan!   Saya tahu ini bisa jadi masalah, tapi pengguna yang memberikan parameter griffon.artifact.force.upgrade biasanya sudah siap menanggung resiko.   Oleh sebab itu, saya mengubah kode program di atas menjadi seperti berikut ini:

import static org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToBoolean
...
boolean forceUpgrade = castToBoolean(settings.getPropertyValue(KEY_FORCE_ARTIFACT_UPGRADE, false))
if (!installed || installed.snapshot || (forceUpgrade ? false : installed.version != dep.version)) continue
if (installed.version!=dep.version) {
  println "Dependency version mismatch but allowed: $dep.name (required: $dep.version, found: $installed.version)"
}
...

Setelah men-build ulang Griffon dan memastikan bahwa folder %GRIFFON_HOME% sudah berisi Griffon hasil modifikasi, saya mencoba memberikan perintah seperti berikut ini:

C:\projects\latihan>griffon -Dgriffon.artifact.force.upgrade=true install-plugin glazedlists
Welcome to Griffon 1.2.0 - http://griffon-framework.org/
Licensed under Apache Standard License 2.0
...
Resolving dependencies...
Dependencies resolved in 548ms.
Environment set to development
Resolving framework plugin dependencies ...
Framework plugin dependencies resolved in 721 ms.
Resolving plugin dependencies ...
Plugin dependencies resolved in 1090 ms.
Dependency version mismatch but allowed: swing (required: 1.0.0, found: 1.2.0)
Software license of glazedlists-1.1.0 is 'Apache Software License 2.0' ...
...
Installed plugin 'glazedlists-1.1.0' in C:\Users\user\.griffon\1.2.0\projects\latihan\plugins/glazedlists-1.1.0

Plugin akhirnya berhasil di-install biarpun ada dependency yang memiliki versi berbeda.

Perihal Solid Snake
I'm nothing...

One Response to Mengatasi Permasalahan Upgrade Plugin Di Griffon

  1. Thanks again for explaning the problem. Filed and fixed http://jira.codehaus.org/browse/GRIFFON-621

    Cheers
    Andres

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: