it-swarm.com.de

Fehlendes Codebasis-Manifestattribut für: xxx.jar

Wenn ich die Anwendung über jnlp starte, erhalte ich eine Nachricht

"Missing Codebase manifest attribute for:xxx.jar "

was bedeutet das?

23
user590444

Dies ist auch beim Ausführen einer internen Anwendung nach dem Aktualisieren meiner JRE auf 1.7u25 aufgetreten. Die Warnungen werden aufgrund einer neuen Sicherheitsfunktion angezeigt, die in 1.7u25 eingeführt wurde, um die Wiederverwendung von nicht autorisiertem Code zu verhindern. In meinem Fall wurde mir auch ein Dialogfeld angezeigt, in dem ich aufgefordert wurde, zu bestätigen, dass die Anwendung auf meinen PC zugreifen soll.

Wenn Sie Zugriff auf die JAR-Datei haben, fügen Sie ihr zwei Attribute hinzu: Permissions und Codebase. Sie müssen entscheiden, ob die Anwendung Zugriff auf alles auf dem PC benötigt. In diesem Fall verwenden Sie den Wert all-permissions für das Permissions Attribut. Verwenden Sie andernfalls sandbox, und die JRE schränkt die Zugriffsebene des Codes auf dem PC ein. Codebase muss wahrscheinlich mit der Codebasis für die JNLP-Datei identisch sein, es sei denn, diese JAR-Datei wird von einer anderen URL heruntergeladen. In diesem Fall muss es sich um diese URL handeln.

Referenz: Oracle's Java 7 Dokumentation

25
Peter

Nach Peters Antwort lösen Sie das Problem auf diese Weise automatisch, falls Sie Netbeans und JavaFX verwenden.

Netbeans 7.3.1 hat diesen "Bug" immer noch nicht behoben (es werden keine Codebasis und Berechtigungen für Sie zum Manifest hinzugefügt). Wenn Sie das Projekt mit Netbeans erstellen und die fehlenden Attribute nicht manuell hinzufügen (und die JAR-Datei erneut signieren) möchten, können Sie die Datei build.xml bearbeiten und die folgenden ANT-Ziele und -Makros hinzufügen:

<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>

Danach müssen Sie nur noch manifest.custom.codebase=<your_codebase> Zu Ihren project.properties hinzufügen. Zum Beispiel: manifest.custom.codebase=localhost

Achtung: Dieser Code ist für eine JavaFX-Anwendung gedacht, die den Standard-ANT-Erstellungsprozess von Netbeans verwendet. Sie müssen es entsprechend aktualisieren, wenn dies nicht der Fall ist. Dies erfordert eine Änderung des ersten Ziels (<target name="-post-jfx-jar">), Der Eigenschaftsnamen und der Bedingung, die die Eigenschaft permissions-elevated Prüft.

10

Beziehen Sie sich auf die detaillierte Erläuterung des von Ihnen erwähnten Fehlers. http://docs.Oracle.com/javase/7/docs/technotes/guides/jweb/no_redeploy.html

2
Madan

Folgendes habe ich gefunden:

URSACHE

Beginnend mit Java 7 Update 51, Java hat das Sicherheitsmodell verbessert, um das Benutzersystem weniger anfällig für externe Exploits zu machen. Die neue Version von Java können Benutzer keine Anwendungen ausführen, die nicht signiert (Unsigniert), selbstsigniert (nicht von einer vertrauenswürdigen Stelle signiert) sind, und keine Anwendungen, denen Berechtigungsattribute fehlen.

Ich habe das Problem beim Start von TopCoder Arena. Es kann leicht mit dem folgenden Link entfernt werden:

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

1
Shivendra