GVKun编程网logo

如何在Java中编译.java文件?(java怎么编译文件)

7

本文的目的是介绍如何在Java中编译.java文件?的详细情况,特别关注java怎么编译文件的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解如何在Java中编译.ja

本文的目的是介绍如何在Java中编译.java文件?的详细情况,特别关注java怎么编译文件的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解如何在Java中编译.java文件?的机会,同时也不会遗漏关于java – 如何在单个命令中编译多个proto文件?、Java文件编译与反编译:javac命令和javap命令、Java泛型可在Eclipse中编译,但不能在javac中编译、Maven如何仅编译修改后的Java文件?的知识。

本文目录一览:

如何在Java中编译.java文件?(java怎么编译文件)

如何在Java中编译.java文件?(java怎么编译文件)

我有以下由Eclipse生成的代码(.java文件)。

import org.eclipse.swt.widgets.Shell;

import org.eclipse.swt.widgets.Display;

public class HelloWorldSWT {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("Hello world!");
        shell.open();
        while (!shell.isDisposed()) {
        if (!display.readAndDispatch()) display.sleep();
        }
        display.dispose();
    }

}

现在,我想从命令行编译以上文件。我转到了源代码所在的目录,并尝试了两个命令:
1. javac HelloWorldSWT.java
2. javac -d / home / myname / workspace / HelloWorldSWT.java

在这两种情况下,我都有相同的错误“无法解析导入org.eclipse”。/ home / myname / workspace /-是类文件所在的目录。

据我了解,编译器看不到org.eclipse.swt软件包。为什么?

可能是因为有问题的软件包位于“ /home/myname/workspace/org.eclipse.swt /”(而不是“ / home / myname
/ workspace / org / eclipse / swt /”)中?

java – 如何在单个命令中编译多个proto文件?

java – 如何在单个命令中编译多个proto文件?

我在单个目录中有两个proto文件,我正在寻找一种方法,可以在单个命令中从这些文件生成类. Protobuf文档说我们需要使用–proto_path参数.
C:\shekhar\proto_trial>dir
 Volume in drive C is C

 Directory of C:\shekhar\proto_trial

07/25/2014  12:16 PM    <DIR>          .
07/25/2014  12:16 PM    <DIR>          ..
07/25/2014  12:16 PM    <DIR>          java_op
07/25/2014  12:16 PM               230 map.proto
07/23/2014  04:24 PM               161 message.proto
07/25/2014  12:17 PM             1,228 response.proto
               3 File(s)          1,619 bytes
               3 Dir(s)  50,259,398,656 bytes free

我使用了–proto_path参数,如下所示

C:\shekhar\proto_trial>protoc 
                       --proto_path=C:\shekhar\proto_trial 
                       --java_out=C:\shekhar\proto_trial\java_op 
                       *.proto

但我得到以下错误

message.proto: File does not reside within any path specified using --proto_path (or -I). 
You must specify a --proto_path which encompasses this file. 
Note that the proto_path must be an exact prefix of the .proto file names -- protoc is too dumb to figure out when two paths (e.g. absolute and relative) are equivalent (it's harder than you think).

请建议一些单独编译所有原型文件的方法.

解决方法

问题是您将–proto_path指定为绝对路径,但将proto文件指定为相对路径.您可以删除–proto_path参数(无论如何都默认为当前目录),或者您可以执行以下操作:
protoc --proto_path=C:\shekhar\proto_trial
       --java_out=C:\shekhar\proto_trial\java_op
       C:\shekhar\proto_trial\*.proto

Java文件编译与反编译:javac命令和javap命令

Java文件编译与反编译:javac命令和javap命令

1.创建一个Test.java文件,并输入内容

public class Test{
    private int m;
    public int inc(){
        return m + 1;
    }
}

2.使用javac命令编译Test.java文件,得到Test.class文件

javac Test.java

3.使用Sublime3打开Test.class

cafe babe 0000 0034 0013 0a00 0400 0f09
0003 0010 0700 1107 0012 0100 016d 0100
0149 0100 063c 696e 6974 3e01 0003 2829
5601 0004 436f 6465 0100 0f4c 696e 654e
756d 6265 7254 6162 6c65 0100 0369 6e63
0100 0328 2949 0100 0a53 6f75 7263 6546
696c 6501 0009 5465 7374 2e6a 6176 610c
0007 0008 0c00 0500 0601 0004 5465 7374
0100 106a 6176 612f 6c61 6e67 2f4f 626a
6563 7400 2100 0300 0400 0000 0100 0200
0500 0600 0000 0200 0100 0700 0800 0100
0900 0000 1d00 0100 0100 0000 052a b700
01b1 0000 0001 000a 0000 0006 0001 0000
0001 0001 000b 000c 0001 0009 0000 001f
0002 0001 0000 0007 2ab4 0002 0460 ac00
0000 0100 0a00 0000 0600 0100 0000 0400
0100 0d00 0000 0200 0e

 

4.使用javap命令,反编译Test.class文件

javap -v Test

输出为:

Classfile /Users/soldier/Desktop/Test.class
  Last modified 2018-9-19; size 265 bytes
  MD5 checksum 551399dd9890a81e8f8c079c6c1f364d
  Compiled from "Test.java"
public class Test
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #4.#15         // java/lang/Object."<init>":()V
   #2 = Fieldref           #3.#16         // Test.m:I
   #3 = Class              #17            // Test
   #4 = Class              #18            // java/lang/Object
   #5 = Utf8               m
   #6 = Utf8               I
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               inc
  #12 = Utf8               ()I
  #13 = Utf8               SourceFile
  #14 = Utf8               Test.java
  #15 = NameAndType        #7:#8          // "<init>":()V
  #16 = NameAndType        #5:#6          // m:I
  #17 = Utf8               Test
  #18 = Utf8               java/lang/Object
{
  public Test();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0

  public int inc();
    descriptor: ()I
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: aload_0
         1: getfield      #2                  // Field m:I
         4: iconst_1
         5: iadd
         6: ireturn
      LineNumberTable:
        line 4: 0
}
SourceFile: "Test.java"

 

使用命令:

javap -c Test

 

输出为:

Compiled from "Test.java"
public class Test {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public int inc();
    Code:
       0: aload_0
       1: getfield      #2                  // Field m:I
       4: iconst_1
       5: iadd
       6: ireturn
}

用法摘要:

-help 帮助
-l 输出行和变量的表
-public 只输出public方法和域
-protected 只输出public和protected类和成员
-package 只输出包,public和protected类和成员,这是默认的
-p -private 输出所有类和成员
-s 输出内部类型签名
-c 输出分解后的代码,例如,类中每一个方法内,包含java字节码的指令,
-v 输出栈大小,方法参数的个数
-constants 输出静态final常量

Java泛型可在Eclipse中编译,但不能在javac中编译

Java泛型可在Eclipse中编译,但不能在javac中编译

我不得不发现我的项目中有Java代码,该代码可以在Eclipse中编译并正常运行,但是会在javac中引发编译错误。

一个完整的代码段:

import java.util.HashSet;
import java.util.Set;

public class Main {

    public static void main(String[] args) {
    Set<Integer> setOfInts = new HashSet<Integer>();
    Set<Object> setOfObjects = covariantSet(setOfInts);
    }

    public static <S,T extends S> Set<S> covariantSet(Set<T> set) {
    return new HashSet<S>(set);
    }

}

javac中的编译返回:

Main.java:10: incompatible types
found   : java.util.Set<java.lang.Integer>
required: java.util.Set<java.lang.Object>
    Set<Object> setOfObjects = covariantSet(setOfInts);
                                           ^

现在,此错误阻止在Maven中构建项目。由于Eclipse编译器具有更高的容忍度,因此我现在不得不假设代码段的定义和用法如上所述,静态方法不是有效的Java吗?

Maven如何仅编译修改后的Java文件?

Maven如何仅编译修改后的Java文件?

我只是好奇地知道这一点,当我不进行“清理”就安装mvn时,maven仅编译了修改后的java文件。Maven如何识别Java文件是否被修改?我相信它没有使用文件的最后修改属性。

我相信的原因:我有一个模块,在合并了svn的更改后,我进行了mvn
install,但它没有编译修改后的文件,当我查看更改时,我发现其中的’long’被修改为’Long’吸气剂和二传手。

所以我只想知道Maven如何识别Java文件是否已更改?

(PS我正在使用Apache Maven 3.0.3,如果有关系的话)

今天关于如何在Java中编译.java文件?java怎么编译文件的介绍到此结束,谢谢您的阅读,有关java – 如何在单个命令中编译多个proto文件?、Java文件编译与反编译:javac命令和javap命令、Java泛型可在Eclipse中编译,但不能在javac中编译、Maven如何仅编译修改后的Java文件?等更多相关知识的信息可以在本站进行查询。

本文标签: