web-dev-qa-db-fra.com

Attribut de manifeste Codebase manquant pour: xxx.jar

Lorsque je lance l'application depuis jnlp je reçois un message

"Missing Codebase manifest attribute for:xxx.jar "

qu'est-ce que ça veut dire?

23
user590444

Je viens de rencontrer cela aussi lors de l'exécution d'une application interne après la mise à jour de mon JRE vers 1.7u25. Les avertissements s'affichent en raison d'une nouvelle fonctionnalité de sécurité introduite dans 1.7u25 pour empêcher la réutilisation non autorisée du code. Dans mon cas, on m'a également présenté une boîte de dialogue me demandant de confirmer que je voulais que l'application ait accès à mon PC.

Si vous avez accès au fichier jar, ajoutez-y deux attributs: Permissions et Codebase. Vous devez décider si l'application nécessite l'accès à tout sur le PC, auquel cas vous utiliserez la valeur all-permissions pour l'attribut Permissions. Sinon, utilisez sandbox et le JRE restreindra le niveau d'accès du code sur le PC. Codebase doit probablement être identique à la base de code du fichier jnlp, à moins que ce fichier jar ne soit téléchargé depuis une URL différente, auquel cas il doit être cette URL.

Référence: Oracle's Java 7

25
Peter

À la suite de la réponse de Peter, voici comment résoudre le problème de manière automatisée, au cas où vous utilisez Netbeans et JavaFX.

Netbeans 7.3.1 n'a toujours pas ce "bug" corrigé (il n'ajoute pas la base de code et les autorisations au manifeste pour vous). Si vous souhaitez utiliser Netbeans pour générer le projet et ne pas ajouter manuellement les attributs manquants (et signer à nouveau le .jar), vous pouvez modifier votre build.xml et ajouter les cibles et macros ANT suivantes:

<target name="-post-jfx-jar">
    <update-libs-manifest />
    <update-jar-manifest jarfile="${jfx.deployment.dir}${file.separator}${jfx.deployment.jar}" />
</target>   

<macrodef name="update-libs-manifest">
    <sequential>
        <property name="pp_rebase_dir" value="${basedir}${file.separator}${dist.dir}${file.separator}lib"/>
        <property name="pp_rebase_fs" value="*.jar"/>

        <condition property="manifest.codebase" value="${manifest.custom.codebase}" else="*">
            <and>
                <isset property="manifest.custom.codebase" />
                <not>
                    <equals arg1="${manifest.custom.codebase}" arg2="" trim="true" />
                </not>
            </and>
        </condition>

        <condition property="manifest.permissions" value="all-permissions" else="sandbox">
            <isset property="permissions-elevated" />
        </condition>

        <echo message="Updating libraries manifest => Codebase: ${manifest.codebase} / Permissions: ${manifest.permissions}" />
        <script language="javascript">
            <![CDATA[
                var dir = project.getProperty("pp_rebase_dir");
                var fDir = new Java.io.File(dir);
                if( fDir.exists() ) {
                    var callTask = project.createTask("antcall");
                    callTask.setTarget("-update-jar-macro-call");
                    var param = callTask.createParam();
                    param.setName("jar.file.to.rebase");
                    var includes = project.getProperty("pp_rebase_fs");
                    var fs = project.createDataType("fileset");
                    fs.setDir( fDir );
                    fs.setIncludes(includes);
                    var ds = fs.getDirectoryScanner(project);
                    var srcFiles = ds.getIncludedFiles();
                    for (i=0; i<srcFiles.length; i++) {
                        param.setValue(dir + "${file.separator}" + srcFiles[i]);
                        callTask.perform();
                    }
                }
            ]]>
        </script>
    </sequential>
</macrodef>

<target name="-update-jar-macro-call">
    <update-jar-manifest jarfile="${jar.file.to.rebase}"/>
</target>

<macrodef name="update-jar-manifest">
    <attribute name="jarfile"/>
    <sequential>
        <echo message="jarfile = @{jarfile}" />
        <jar file="@{jarfile}" update="true">
            <manifest>
                <attribute name="Codebase" value="${manifest.codebase}"/>
                <attribute name="Permissions" value="${manifest.permissions}"/>
            </manifest>
        </jar>
    </sequential>
</macrodef>

Après cela, il vous suffit d'ajouter manifest.custom.codebase=<your_codebase> à votre project.properties. Par exemple: manifest.custom.codebase=localhost

Attention: Ce code est destiné à une application JavaFX utilisant le processus de génération ANT par défaut de Netbeans. Vous devrez le mettre à jour en conséquence si ce n'est pas votre cas - cela nécessitera un changement sur la première cible (<target name="-post-jfx-jar">), les noms des propriétés et la condition qui vérifie permissions-elevated propriété.

10
Philippe Franklin

Reportez-vous à l'explication détaillée de l'erreur que vous avez mentionnée. http://docs.Oracle.com/javase/7/docs/technotes/guides/jweb/no_redeploy.html

2
Madan

Voici ce que j'ai trouvé:

CAUSE

À partir de Java 7 Update 51, Java a un modèle de sécurité amélioré pour rendre le système utilisateur moins vulnérable aux exploits externes. La nouvelle version de Java ne permet pas aux utilisateurs d'exécuter les applications qui ne sont pas signées (non signées), auto-signées (non signées par une autorité de confiance) et les applications auxquelles il manque des attributs d'autorisation.

J'ai eu le problème lors du lancement de TopCoder Arena. Il peut être facilement retiré à l'aide du lien ci-dessous:

http://www.Java.com/en/download/help/Java_blocked.xml

1
Shivendra