问题
I need to extract all hard coded Strings
values from all Java
files in a Java project
Into a Java Constant file
for example
Input
// Java file number 1
public class A {
public static void main(String[] args) {
System.out.println("HardCoded String A");
}
}
// Java file number 2
public class B {
public static void main(String[] args) {
System.out.println("HardCoded String B");
}
}
Output
// a Java Constant file
public class MyConstants {
public static final String HardCodedString_01 = "HardCoded String A";
public static final String HardCodedString_02 = "HardCoded String B";
}
// Java file number 1
public class A {
public static void main(String[] args) {
System.out.println(MyConstants.HardCodedString_01);
}
}
// Java file number 2
public class B {
public static void main(String[] args) {
System.out.println(MyConstants.HardCodedString_01);
}
}
I am aware of Externalize Strings for Eclipse

And when i check this post
Extract all string from a java project
I could not find the link of provided presentation
Also i check this post
Externalize strings for Android project
But that is provided for Android
projects not Java
projects
回答1:
First to inspect all hard coded Strings values from all using Eclipse
The core idea is thatThe Regular Expression
of Java hard coded String value is "*"
So
We can do that Using search by this criteria
For example
Eclipse Search Inquiry

Eclipse Search Result

回答2:
Might be a over-engineered solution, but give a try to sonarqube which can give you static analysis of code and much more than just hard-coded string values.
If you are looking for a code to do that, you can try linux commandline (e.g. grep -rnw '/path/to/somewhere/' -e "pattern") solutions.
回答3:
I'm guessing you have a large project, and don't necessarily want to hunt your hard-coded strings.
While Eclipse's "Externalize String" won't do all files in one go, if you go to context of your project (by right-clicking the project or your source directory), it should find all of your candidate classes. However, you'll still need to iterate through each file via a new window, but this at least gives you the list of files as verified with Kepler SR1.
回答4:
We can use Java Code also.We need to pass the directory name as below
and it will give the File name and matched Line which contains the Hard Code
String ( " <Hard Code String in Double Quotes> " ) .
Directory/Path : c:\User\XYZ\src\
Code :
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.apache.log4j.Logger;
public class ScanFiles {
private static final Logger logger = ScanFilesLogger.getLogger(ScanFiles.class);
private static void searchFiles(String folderPath, String searchString) throws IOException {
File folder = new File(folderPath);
List<File> files = (List<File>) FileUtils.listFiles(folder, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
if (folder.isDirectory()) {
File[] fList = folder.listFiles();
for (File file : files) {
if (!file.canRead()) {
file.setReadable(true);
}
String content = "";
try(BufferedReader br = new BufferedReader(new FileReader(file));) {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
logger.info("File ::::: " + file.getName());
while ((line = br.readLine()) != null)
{
// Below condition we can omit in the search condition //
if (line.contains(searchString) && (!line.contains("System.out.println") && !line.contains("logger.info") && !line.contains("Logger.info") && !line.contains("logger.debug") && !line.contains("Logger.debug") && !line.contains("logger.error") && !line.contains("Logger.error") && !line.contains("Logger.info") && !line.contains("logger.debug") && !line.contains("Logger.debug") && !line.contains("logger.error")
&& !line.contains("LOGGER.debug") && !line.contains("LOGGER.info") && !line.contains("LOGGER.error") && !line.contains("assertTrue") && !line.contains("//") && !line.contains("/*")))
{
logger.info("Matched Line :::::"+line);
}
}
}
}
} else {
System.out.println("Not a Directory!");
}
}
public static void main(String args[]) throws IOException{
if(args.length == 0)
{
logger.info(" :::::::::: PATH cannot be empty ::::::::::");
System.exit(0);
}
searchFiles(new File(args[0]).getAbsolutePath(),"\"");
}
}
来源:https://stackoverflow.com/questions/20733282/how-to-extract-all-string-from-all-java-files-in-a-java-project